特殊说明:版权归个人所有,请勿转载,谢谢合作。
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;
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
