A timer is an internal routine that repeatedly measures a specified interval, in milliseconds.(这是 microsoft 给出的解释 )
计时器周期性的给程序一个WM_TIMER消息,该消息的 wParam 参数是计时器的标识符, lParam 参数是被SetTimer函数设置的回调函数TimerProc的指针。
相关函数介绍:
UINT_PTR WINAPI SetTimer(
_In_opt_ HWND hWnd,
_In_ UINT_PTR nIDEvent,
_In_ UINT uElapse,
_In_opt_ TIMERPROC lpTimerFunc
);
SetTimer函数的第一个参数是要与该计时器关联的窗口句柄,该参数可以为nullptr;
第二个参数是计时器的标识符,类型是无符号整形,建议是定义在头文件中的宏,但值不应该设置为0 /* 例:#define TIMER 1 */;
第三个参数是计时器的计时间隔,单位是毫秒,范围从USER_TIMER_MINIMUN ( 0x0000000A ) 到 USER_TIMER_MAXIMUM ( 0x7FFFFFFF ), 如果超出范围则被设置为边界值;
第四个参数为计时器函数,该函数应被定义如下
VOID CALLBACK TimerProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ UINT_PTR idEvent,
_In_ DWORD dwTime
);
第一个参数与SetTimer函数相同;
第二个参数为消息,传递给该形参的值应固定为WM_TIMER;
第三个参数为计时器的标识符;
第四个参数应是从GetTickCount函数传回的值,这是从系统启动到现在的毫秒数。
BOOL WINAPI KillTimer(
_In_opt_ HWND hWnd,
_In_ UINT_PTR uIDEvent
);
第一个参数是与指定计时器关联的窗口句柄;
第二个参数是指定计时器的标识符。
函数用法:
SetTimer的用法有三种,在此我会一一介绍;
方法一:
#define TIMER 1
……
SetTimer ( hWnd, TIMER, 100, nullptr);
……
KillTimer (hWnd, TIMER);
这种用法会建立一个计时器,该计时器每隔100ms也就是0.1s使hWnd所指向的窗口接收到一个WM_TIMER消息。
更改次计时器的时间间隔只需要重新调用一边 SetTimer 函数,将 uElapse 设置为你想要的时间,注意单位为ms,更改计时器时间将会重置计时器。
这种方法是最基本的方法。
方法二:
#define TIMER 1
……
SetTimer ( hWnd, TIMER, 100, TimerProc);
……
KillTimer ( hWnd, TIMER);
此方法建立一个时间间隔为0.1s的计时器,与第一种方法不同的是TimerProc将会对WM_TIMER的消息处理。
你可以在 hWnd 所指的回调函数中处理 WM_TIMER 消息,但是这将会使 TImerProc 没有意义,既然写了这个函数那就是要用的,我想应该不会有人这样做的。
更改计时器时间的方法同上。
方法三:
UINT idTImer = SetTImer (nullptr, 0, 100, TImerProc);
……
KillTimer (nullptr, idTimer);
如果 hWnd 参数被设置为nullptr, 并且nIdEvent参数没有匹配上已存在的计时器标识符,SetTimer函数会返回一个计时器ID。
补:同一个计时器可以与多个窗口句柄相关联;同一个窗口可以有多个计时器,利于计时器标识符( wParam )来区别计时器消息。