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


- 前言
- (1):關于C++的幾個要點
- (2):完整的開發流程
- (3):窗口的重繪
- (4):創建菜單
- (5):具有單選標記的菜單
- (6):創建右鍵菜單
- (7):多邊形窗口
- (8):繪圖(A)
- (9):繪圖(B)
- (10):繪圖(C)
- (11):使用控件——先來耍一下按鈕
- (12):使用控件——單選按鈕
- (13):握手對話框
- (14):用對話框作為主窗口
- (15):ListView控件
- (16):ListView的多個視圖
- (17):啟動和結束進程
- (18):使用對話框的兩個技巧
- (19):瀏覽和打開文件
- (20):瀏覽文件夾
- (21):復制&粘貼&剪貼板操作
- (22):抓取屏幕
- (23):漸變顏色填充
- (24):計時器
- (25):監視剪貼板