有好些時間沒寫博客了,今天要來耍一下計時器,就是我們常說的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;
結果就如下面兩圖所示。

