定时器在实际编程中使用频率比较高,例如一些需要间隔一定时间自动执行的任务,如果任务执行对时间精度要求不是太苛求,使用简单的定时器就是一个较好的选择。当然,由于定时器在系统的优先级较低,有时在执行具体任务时可能会遇到一些意想不到的问题。如果这样的话,可以考虑直接使用线程或调用GetTickCount函数自己处理。对于一些简单的游戏编程,定时器完全可以胜任。本文以VC6.0为环境说明定时器的使用方法。
在Windows编程中,可以使用SetTimer函数设置并启动定时器。该函数在SDK的API定义中有四个参数,原型定义如下:
UINT SetTimer( HWND hWnd,
UINT nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc );
参数含义:
nhWnd
与定时器关联的窗口句柄。该窗口必须被调用的线程所拥有。如果该参数设为NULL,则意味着定时器没有需要关联的窗口,那么第二个参数nIDEvent就会被忽略;
nnIDEvent
指定一个非0的标识。如果hWnd参数为NULL,该参数被忽略;
nuElapse
定时器间隔的时间,以毫秒为单位;
nlpTimerFunc
指定的间隔时间自动执行的回调函数的指针;如果该参数为NULL,系统则自动向英勇程序队列发送WM_TIMER消息;如果不为NULL,则会自动执行所指定的回调函数。该回调函数的定义如下:
voidCALLBACK TimerProc(HWND hwnd,
UINTuMsg,
UINTidEvent,
DWORDdwTime );
回调函数的参数含义:
lhwnd:要与定时器关联的窗口句柄;
luMsg:指定WM_TIMER消息;
lidEvent:定时器的标识;
ldwTime:指定自系统启动后的已经过去的毫秒数,该值由GetTickCount函数获得。
从以上SetTimer函数的定义可以看出,使用定时器时,有两个地方可以用来编写定时器要执行的任务代码:(1)WM _TIMER消息中;(2)自定义的TIMERPROC类型的任务函数。
由于采用SDK方式编成,如果要在Windows窗口中进行绘制,首先必须先生成一个空白窗口(没有菜单、工具栏或状态栏),为此需要创建一个Win32 Application类型的空工程,然后为工程增加一个源文件(.cpp文件),将下面创建空白窗口的代码复制到源文件中:
#include
//声明回调函数
LONG CALLBACK MyWndProc(HWND, UINT, WPARAM, LPARAM);
//=============================&