由于自己对于创建窗口已经很熟悉了,所以就直接生成非空的win32程序。
思路其实很简单,代码敲完直接运行过,好有成就感啊:
①加载需要的数字和符号位图
②将位图放入内存DC
③得到系统时间,然后计算时分秒的每个数字的值
④找到时分秒数字与图片上数字的对应关系,然后通过计算确定位置。
⑥Bitblt将图片放入屏幕。
⑦选出加载进入内存DC的位图
⑧删除DC
⑨设置定时器,刷新区域
⑩删除图片对象的句柄
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
BITMAP bmp;
hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_NUM));
GetObject(hBitmap,sizeof(BITMAP),&bmp);
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hOldbmp = (HBITMAP)SelectObject(hMemDc,hBitmap);
RECT rect;
GetClientRect(hWnd,&rect);
int iWidth = rect.right - rect.left;
int iHeight = rect.bottom - rect.top;
SYSTEMTIME st;
GetLocalTime(&st);
int iTime[8] = {st.wHour/10,st.wHour%10,11,st.wMinute/10,st.wMinute%10,11,st.wSecond/10,st.wSecond%10};
for (int i =0 ;i < 8;i++)
{
BitBlt(hdc,(i)*bmp.bmWidth,0,bmp.bmWidth,bmp.bmHeight/12,hMemDc,0,(11-iTime[i])*bmp.bmHeight/12,SRCCOPY);
}
SelectObject(hMemDc,hOldbmp);
DeleteDC(hMemDc);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
KillTimer(hWnd,1);
PostQuitMessage(0);
break;
case WM_CREATE:
{
SetTimer(hWnd,1,1000,NULL);
}
break;
case WM_TIMER:
{
InvalidateRect(hWnd,NULL,TRUE);
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
运行结果: