|
撰/ahliu
計時器概述計時器相信是Windows裡最簡單的元件了,是嗎?我們感受不到計時器在運作,因此也不知它是否真正運行著,或已被「殺」(Kill The Timer),有種恐?感嗎?就因為Timer純粹是一個隱藏著的計時器,成就了它簡單的用法和API函數。 其實Timer和鍵盤滑鼠一樣,都是一個Input Device,Timer會限時限刻輸入訊號到CPU中,產生WM_TIMER訊息。在Windows中,你可控制Timer由每1毫秒發放一個訊息,至每4,294,967,295毫秒(約50日)發放一個訊息,但只不過是理論值,實際上由於BIOS的限制,硬件只能每秒發出18.2次(即每次 54.925毫秒)訊號,即Timer最低只能每55毫秒發出一個訊號,低於此值一律當55毫秒計。 如何呼叫計算器我們共有三種方法呼叫計時器: SetTimer(HWND hwnd,UINT TimerID,UINT TimeInterval,TIMERPROC lpTimerProc);
1. 第一個參數當然是本程式的Window Handler,第二個就是本計時器的ID,若你的程式有多個計時器,你必需確保計時器ID沒有重覆。第三個參數就是每隔多久發放訊號,第四個參數就是專責處理計時器訊號的函數,通常都不需要並設為NULL。 SetTimer(hwnd,1,100,NULL); 代表該計時器每0.1秒就會發出 WM_TIMER訊號。 如果你有多個計時器,那我們應怎樣分別是哪個計時器發出WM_TIMER呢?我們可用wParam來分別: case WM_TIMER: switch(wParam) { case 1: ... // Do something break; case 2: ... // Do something different break; } return 0; }
當你用於計時器時,請呼叫KillTimer來結束計時器: KillTimer(hwnd,1);
2. 第二個方法就是使用SetTimer第四個參數 - 呼叫專責處理計時器函數。計時器CALLBACK函數原型如下: VOID CALLBACK TimerProc(HWND hwnd,UINT iMsg,UINT TimerID,DWORD Time)
在SetTimer時,我們也需要更改第四個參數為: SetTimer(hwnd,1,100,(TIMERPROC)TimerProc)
3. 第三個方法類似第二個方法,但這次我們把Window Handler設為NULL,並且忽略Timer ID,這是最罕見的用法,亦都是不建議使用的方法: SetTimer(NULL,0,100,(TIMERPROC)TimerProc)
記得五子棋程式要計時嗎我們在選單上「選項」一欄中,我們有「行棋時間」一項,它的Popup Menu有多個時限值可設置,這時我們需要計時器的幫助。 在這個程式中,我們在白方按下滑鼠左鍵後,清除之前的Timer,然後建立一個新的Timer開始計時,時段為一秒鐘,每隔一秒就發送WM_TIMER,在這Message Handler中,會把TimeElapsed這個記錄行棋時間的變數增加一,代表行棋時間共增加了一秒,若行棋時間超出了時限設定值,就會自動把行棋權交給對方,並將TimeElapsed重新置零。 當然,在對方沒有超時的情況下,只要對方按下放了棋,即在發放WM_LBUTTONUP後,就會把行棋控制權交給自己,這時我們也需重設計時器,重新計時。在分出勝負時亦需要停止計時。 本章的 Source Code (五子棋計時版)可按此下載。
相關文件:
- 五子棋 source
發表日期:2004-06-21
|
|
|