利用上篇的文章《Windows Mobile上实现图片任意角度旋转》,可以实现效果非常绚丽的始终效果。每个始终我们需要三张图片,钟盘、时针、分针三张png图片。
如下图:
图片是从android中取出的。
实现代码如下:
- void DrawClock(HDC hdc, RECT rc)
- {
- SYSTEMTIME systemTime;
-
- GetLocalTime(&systemTime);
-
- IImage *pCurClockHour = NULL;
- IImage *pCurClockMin = NULL;
- ImageInfo imDialInfo;
- ImageInfo imHourInfo;
- ImageInfo imMinInfo;
-
- LPBYTE pHourBuf = NULL;
- LPBYTE pMinBuf = NULL;
- POINT ptClockCenter;
- RECT rcDial;
- RECT rcHour;
- RECT rcMin;
-
- GetClientRect(g_hWnd, &rc);
-
-
- HDC hdcOffSet = CreateCompatibleDC(hdc);
- HBITMAP hbmpOffset = CreateCompatibleBitmap(hdc,
- rc.right - rc.left, rc.bottom - rc.top);
- SelectObject(hdcOffSet, hbmpOffset);
- FillRect(hdcOffSet, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
-
-
- if(pClockDial == NULL)
- pImgFactory->CreateImageFromFile(TEXT("\\clockgoog_dial.png"),&pClockDial);
- if(pClockHour == NULL)
- pImgFactory->CreateImageFromFile(TEXT("\\clockgoog_hour.png"),&pClockHour);
- if(pClockMin == NULL)
- pImgFactory->CreateImageFromFile(TEXT("\\clockgoog_minute.png"),&pClockMin);
-
-
-
-
-
-
-
-
-
- pClockDial->GetImageInfo(&imDialInfo);
- rcDial.left = ((rc.right - rc.left) - imDialInfo.Width)/2 + rc.left;
- rcDial.top = ((rc.bottom - rc.top) - imDialInfo.Height)/2 + rc.top;
- rcDial.right = rcDial.left + imDialInfo.Width;
- rcDial.bottom = rcDial.top + imDialInfo.Height;
-
- ptClockCenter.x = rcDial.left + imDialInfo.Width/2;
- ptClockCenter.y = rcDial.top + imDialInfo.Height/2;
-
- RotateImage(pImgFactory, pClockHour, pCurClockHour,
- pHourBuf, systemTime.wHour * 6 *3.14/180);
- RotateImage(pImgFactory, pClockMin, pCurClockMin,
- pMinBuf, (systemTime.wMinute * 6 + systemTime.wSecond/10) *3.14/180);
-
- pCurClockHour->GetImageInfo(&imHourInfo);
- pCurClockMin->GetImageInfo(&imMinInfo);
-
- rcHour.left = ptClockCenter.x - imHourInfo.Width/2;
- rcHour.right = rcHour.left + imHourInfo.Width;
- rcHour.top = ptClockCenter.y - imHourInfo.Height/2;
- rcHour.bottom = rcHour.top + imHourInfo.Height;
-
- rcMin.left = ptClockCenter.x - imMinInfo.Width/2;
- rcMin.right = rcMin.left + imMinInfo.Width;
- rcMin.top = ptClockCenter.y - imMinInfo.Height/2;
- rcMin.bottom = rcMin.top + imMinInfo.Height;
-
- pClockDial->Draw(hdcOffSet, &rcDial, NULL);
- pCurClockHour->Draw(hdcOffSet, &rcHour, NULL);
- pCurClockMin->Draw(hdcOffSet, &rcMin, NULL);
-
- pCurClockHour->Release();
- pCurClockMin->Release();
-
- delete pHourBuf;
- delete pMinBuf;
- BitBlt(hdc, rc.left,rc.top, rc.right-rc.left,
- rc.bottom - rc.left, hdcOffSet, 0,0,SRCCOPY);
-
- DeleteDC(hdcOffSet);
- DeleteObject(hbmpOffset);
- }
最终效果:
(jinhaijian) |