程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Win32開發入門(24):計時器

Win32開發入門(24):計時器

編輯:關於C++

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

結果就如下面兩圖所示。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved