特殊说明:版权归个人所有,请勿转载,谢谢合作。
7.3 定时器应用示例
【例7-1】程序启动后显示当前的系统时间。定时器的示例代码如下:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; // 结构体包含了用于绘制 // 窗口客户区的信息 HDC hdc; // 设备环境句柄 int i = 0; // 消息处理 // switch (message) { // 图形绘制事件 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { SYSTEMTIME sys; char szTime[64] = { 0 }; GetLocalTime(&sys); sprintf(szTime, "%4d年%02d月%02d日 %02d:%02d:%02d", sys.wYear,sys.wMonth,sys.wDay, sys.wHour, sys.wMinute, sys.wSecond); RECT rtPos; GetClientRect(hWnd, &rtPos); DrawText(hdc, szTime, strlen(szTime), &rtPos, DT_CENTER); } EndPaint(hWnd, &ps); break; // 定时器处理消息 case WM_TIMER: // 只处理我们自己的消息 if(wParam == 999) { RECT winRt; GetClientRect(hWnd, &winRt); InvalidateRect(hWnd, &winRt, TRUE); }//end if break; // 窗口创建消息 case WM_CREATE: // 设置定时器 SetTimer(hWnd, 999, 1000, NULL); break; // 窗口关闭消息 case WM_CLOSE: // 删除定时器 KillTimer(hWnd, 999); DestroyWindow(hWnd); break; // 窗口销毁消息,关闭窗口时响应。 case WM_DESTROY: PostQuitMessage(0); break; default: // 调用系统默认消息处理,即交给系统处理。 return DefWindowProc(hWnd, message, wParam, lParam); }//end switch return 0; }
程序执行结果如图7.1所示。
- 图7.1 定时器执行结果
首先,捕获WM_CREATE消息,主要目的是在窗口的创建之初,使用SetTimer函数设置定时器,并且每隔一秒钟响应一定WM_TIMER消息。消息ID为999。
// 窗口创建消息 case WM_CREATE: // 设置定时器 SetTimer(hWnd, 999, 1000, NULL); break;
其次,捕获WM_TIMER消息,每隔一秒钟响应一次此消息,通过wParam参数来判断消息是否属于的刚刚创建的消息(ID为999),如果是,则获得系统客户区尺寸,并对该客户区进行刷新操作。目的是响应WM_PAINT消息。
// 定时器处理消息 case WM_TIMER: // 只处理我们自己的消息 if(wParam == 999) { RECT winRt; GetClientRect(hWnd, &winRt); InvalidateRect(hWnd, &winRt, TRUE); }//end if break;
再次,捕获WM_PAINT消息,通过GetLocalTime函数来获得系统时间,并将时间格式化到字符串中,最终以DrawText的方式,将文本绘制到屏幕上。
// 图形绘制事件 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { SYSTEMTIME sys; char szTime[64] = { 0 }; GetLocalTime(&sys); sprintf(szTime, "%4d年%02d月%02d日 %02d:%02d:%02d", sys.wYear,sys.wMonth,sys.wDay, sys.wHour, sys.wMinute, sys.wSecond); RECT rtPos; GetClientRect(hWnd, &rtPos); DrawText(hdc, szTime, strlen(szTime), &rtPos, DT_CENTER); } EndPaint(hWnd, &ps); break;
最后,捕获WM_CLOSE消息,通过KillTimer函数将ID为999的定时器进行销毁,并使用DestroyWindow函数将应用程序窗口销毁。
// 窗口关闭消息 case WM_CLOSE: // 删除定时器 KillTimer(hWnd, 999); DestroyWindow(hWnd); break;
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。