有好些時間沒寫博客了,今天要來耍一下計時器,就是我們常說的Timer,它雖然不是什麼復雜的東 西,也稱不 上牛X,不過,用處還是不少的,對於那些需要每隔一定時間執行一次的任務,那是相當有 用。
先來認識一下一對函數,注意,是一對,不是一個。
SetTimer——設置並啟用計時 器;
KillTimer——取消計時器。
現在你明白為什麼要一對的原因了,就好比進程操作 ,有啟動或創建進程的函數,就肯定要有關閉進程的函數;有GetDC就肯定要伴隨著ReleaseDC函數。陰 與陽是此消彼長的。
先說SetTimer,函數的定義我不說了,自己看頭文件和MSDN就行了,主要 說說以下兩個參數:
nIDEvent指的是計時器的ID,一個數值,你可以隨例取,只要不是負數不 是小數就行,例如10,200,56,115,222等;最後一個參數lpTimerFunc是指向一個回調函數的指針, 這個與WindowProc類似的,但是這個參數是可以為NULL的。
當該參數為NULL時,在WindowProc 中你就要捕捉WM_TIMER消息,不過,這個是消息是低優先級的,系統會在處理完其他消息後,閒著沒事 干才會來處理WM_TIMER消息。如果lpTimerFunc參數不為NULL,就不用捕捉WM_TIMER了,直接在回調函 數中處理即可。
如果所使用的Timer的ID已經存在,那麼就會以新的Timer來取代原有的Timer。
KillTimer好說,就是銷毀計時器,其中,Timer的ID要與前面SetTimer時用的ID保持一致,這 個就不用特別說明了,你拿著你的借書證去圖書館借書,到還書的時候,你當然不會拿別人的借書證去 還書吧?
理論的東西都是說多無益,還是用實例來說話吧。
先簡單說說這個例子,主 要運用計時器,每隔一秒(1000毫秒)執行一次,但每次的情況不同,所以用一個BOOL類型的變量來標 識,如果為TRUE就在WM_PAINT事件中把窗口的客戶區域填充為紅色,如果為FALSE就不填充。如此,就 可以使得窗口呈現出一閃一閃的效果。
我只貼出核心代碼,完整的例子我隨後上傳到【資源】 中。
// Timer的回調函數 VOID CALLBACK TimerProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ UINT_PTR idEvent, _In_ DWORD dwTime ) { isBorderDrawed = !isBorderDrawed; RECT rect; GetClientRect(hwnd,&rect); InvalidateRect(hwnd, &rect, TRUE); }
/* 處理WM_PAINT消息 */ ase WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意繪圖代碼... // 獲取窗口邊框矩形 RECT rect; GetClientRect(hWnd, &rect); if (isBorderDrawed) { HBRUSH hb = CreateSolidBrush(RGB(255,0,0)); FillRect(hdc,&rect, hb); SelectObject(hdc,hb); } EndPaint(hWnd, &ps); break;
結果就如下面兩圖所示。