第五节 定时器使用
命令消息:WM_TIMER
1->发送定时器消息 SetTimer(hwnd,1,60000,NULL).
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
)
SetTimer 因为在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了 于是SetTimer函数的原型变为:
UINT SetTimer(UINT nIDEvent,
UINT nElapse
,void(CALLBACK EXPORT *lpfnTimer)
(HWND,UINT ,YINT ,DWORD))
2->通过添加消息处理函数WM_TIMER 来处理
3->消灭定时器消息 KillTimer (hwnd, 1) ;
在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID
4->设置多个定时器 #define TIMER_SEC 1 #define TIMER_MIN 2
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
5->多个定时器处理 caseWM_TIMER: //普通函数处理
switch (wParam)
{
case TIMER_SEC:
//每秒一次的处理
break ;
case TIMER_MIN:
//每分钟一次的处理
break ;
}
6->回调函数处理 设定定时器的第一种方法是把WM_TIMER消息发送到通常的窗口消息处理程序,而第二种方法是让Windows直接将定时器消息发送给您程序的另一个函数 //只处理WM_TIMER消息
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
处理WM_TIMER消息
}
7->启动回调函数SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;