定时器是一种输入设备,它会周期性地通知操作系统给应用程序发送定时器消息。定时器的时间间隔达到后,Windows会给程序发送WM_TIMER消息以表示时间到了,而程序猿需要在WM_TIMER消息中处理对定时器的响应。
设置定时器可使用如下SetTimer()函数:
UNIT SetTimer(
HWND hWnd, //窗口句柄
UNIT nIDEvent, //定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UNIT uElapse, //时间间隔,单位为毫秒
TIMERPROC lpTimerFunc //回调函数
};
定时器编号从1开始,lpTimerFunc设置成NULL即可。
调用KillTimer函数关闭定时器,需要指出的是,KillTimer参数中的定时器编号需要和SetTimer中定时器编号一致。
(例如在游戏中可以通过设置不同的定时器时间间隔来调整游戏速度,可以在初始化窗口的时候设置定时器)
TIPS:由于Windows不是实时操作系统,定时器的时间间隔尽量不要少于10毫秒以提高定时器准确度。
销毁定时器可用KillTimer()函数:
BOOL KillTimer(
HWND hWnd,
UINT uIDEvent
);
参数含义同SetTimer()。
如果函数执行成功,则返回非0,否则返回0值。
多个定时器:
有时需要多个定时器,多个定时器同时使用的例子如下:
#define TIMER_ID1 1
#define TIMER_ID2 2
#define TIMER_ID3 3
SetTimer(hWnd, TIMER_ID1, 5000, NULL);
SetTimer(hWnd, TIMER_ID2, 6000, NULL);
SetTimer(hWnd, TIMER_ID3, 7000, NULL);
在消息响应函数里需要根据wParam参数来区分不同的定时器编号,分别进行相应的消息处理:
case WM_TIMER:
switch(wParam)
{
case TIMER_ID1:
MessageBox(...);
break;
case TIMER_ID2:
MessageBox(...);
break;
case TIMER_ID3:
MessageBox(...);
break;
}