void CALLBACK EXPORT TimerProc(
HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT nIDEvent // timer identification
DWORD dwTime // system time
){}
#define TIME_SEC 1
#define TIME_MIN 2
然後調用SetTimer設定兩個計時器
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;SetTimer (hwnd, TIMER_MIN, 600, NULL)
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相同的timer
uElapse是以毫秒指定的計時間隔值,範圍爲1毫秒到4,294,967,295毫秒(將近50天),這個值指示Windows每隔多久時間給程序發送WM_TIMER消息。
lpTimerFunc是一個回調函數的指針,俗稱TimerFunc;如果lpTimerFunc爲NULL,系統將嚮應用程序隊列發送WM_TIMER消息;如果lpTimerFunc指定了一個值,DefWindowProc將在處理WM_TIMER消息時調用這個lpTimerFunc所指向的回調函數,因此即使使用TimerProc代替處理WM_TIMER也需要向窗口分發消息。
關於KillTimer對消息隊列中剩餘未處理的WM_TIMER消息的影響,MSDN和Programming Windows上的說法完全相反。MSDN的說法很乾脆:The KillTimer function does not remove WM_TIMER messages already posted to the message queue. 而petzold則說The KillTimer call purges the message queue of any pending WM_TIMER messages. Your program will never receive a stray WM_TIMER message following a KillTimer call.(KillTimer消除消息隊列中任何未處理的WM_TIMER消息,調用KillTimer後你的程序永遠不會收到一條“漂泊遊蕩”的WM_TIMER消息)
lParam爲指向TimerProc的指針,如果調用SetTimer時沒有指定TimerProc(參數值爲NULL),則lParam爲0(即NULL)。
可以通過在窗口過程中提供一個WM_TIMER case處理這個消息,或者,默認窗口過程會調用SetTimer中指定的TimerProc來處理WM_TIMER消息
#define ID_TIMER 1
SetTimer(hWnd,ID_TIMER,1000,NULL) ; KillTimer(hWnd,ID_TIMER) ; |
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{ //處理WM_TIMER訊息 } |
SetTimer(hWnd,ID_TIMER,1000,TimerProc) ;
KillTimer(hWnd,ID_TIMER) ; |
UINT_PTR iTimerID ;
iTimerID = SetTimer(NULL,0,1000,TimerProc) ; KillTimer(NULL,iTimerID) ; |
#define TIMER_SEC 1
#define TIMER_MIN 2 然後使用兩個SetTimer來設定兩個計時器: SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ; WM_TIMER的處理如下所示: case WM_TIMER: switch (wParam) { case TIMER_SEC: //每秒一次的處理 break ; case TIMER_MIN: //每分鐘一次的處理 break ; } return 0 ; |