定时器的使用:三种方法
如果您需要在整个程序执行期间都使用定时器,那么您将得从
WinMain 函数中或者在处理 WM_CREATE 消息时呼
叫
SetTimer,并在退出 WinMain 或响应 WM_DESTROY 消息时呼叫 KillTimer。根据呼叫 SetTimer 时使用
的参数,可以下列三种方法之一使用定时器。
方法一
这是最方便的一种方法,它让
Windows 把 WM_TIMER 消息发送到应用程序的正常窗口消息处理程序中,
SetTimer 呼叫如下所示:
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
第一个参数是其窗口消息处理程序将接收
WM_TIMER 消息的窗口句柄。
第二个参数是定时器
ID,它是一个非 0 数值,在整个例子中假定为 1。
第三个参数是一个
32 位无正负号整数,以毫秒为单位指定一个时间间隔,一个 60,000 的值将使 Windows 每分
钟发送一次
WM_TIMER 消息。
您可以通过呼叫
KillTimer (hwnd, 1) ;
方法二
设定定时器的第一种方法是把
WM_TIMER 消息发送到通常的窗口消息处理程序,而第二种方法是让 Windows 直接
将定时器消息发送给您程序的另一个函数。
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
方法三
设定定时器的第三种方法类似于第二种方法,只是传递给
SetTimer 的 hwnd 参数被设定为 NULL,并且第二个参
数(通常为定时器
ID)被忽略了,最后,此函数传回定时器 ID:
iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;
如果没有可用的定时器,那么从
SetTimer 传回的 iTimerID 值将为 NULL。
KillTimer 的第一个参数(通常是窗口句柄)也必须为 NULL,定时器 ID 必须是 SetTimer 的传回值:
KillTimer (NULL, iTimerID) ;
--------------------
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
SDK
—
编程笔记
计时器篇两个计时器
API
的讨论
SetTimer 函数用于创建一个计时器,KillTimer 函数用于销毁一个计时器。计时器属于系统资源,使用完应及
时销毁。
SetTimer
的函数原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC
lpTimerFunc ) ;
其中
hWnd 是和 timer 关联的窗口句柄,此窗口必须为调用 SetTimer 的线程所有;如果 hWnd 为 NULL,没有窗口和
timer 相关联并且 nIDEvent
参数被忽略
nIDEvent 是 timer 的标识,为非零值;如果 hWnd 为 NULL 则被忽略;如果 hWnd 非 NULL 而且与 timer 相关
联的窗口已经存在一个为此标识的
timer,则此次 SetTimer 调用将用新的 timer 代替原来的 timer。timer
标识和窗口相关,两个不同的窗口可以拥有
nIDEvent 相同的 tiemr
uElapse 是以毫秒指定的计时间隔值,范围为 1 毫秒到 4,294,967,295 毫秒(将近 50 天),这个值指示
Windows 每隔多久时间给程序发送 WM_TIMER
消息。
lpTimerFunc 是一个回调函数的指针,俗称 TimerFunc;如果 lpTimerFunc 为 NULL,系统将向应用程序队
列发送
WM_TIMER 消息;如果 lpTimerFunc 指定了一个值,DefWindowProc 将在处理 WM_TIMER 消息时调用
这个
lpTimerFunc 所指向的回调函数,因此即使使用 TimerProc 代替处理 WM_TIMER 也需要向窗口分发消息。
关于
SetTimer 的返回值:如果 hWnd 为 NULL,返回值为新建立的 timer 的 ID,如果 hWnd 非 NULL,返回一个
非
0 整数,如果 SetTimer 调用失败则返回 0
KillTimer 的函数原型为:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 参数意义同
SetTimer
。