MFC中OnTimer的應用

 

MFC中OnTimer的應用

OnTimer()函數用於實現定時控制功能,定時控制功能主要由下面三個函數共同實現:ios

SetTimer, KillTimer()和OnTimer().windows

粗略的說,Settimer是設置一個計時器並開始執行計時器Ontimer中的代碼,Ontimer是計時器所執行的代碼。KillTimer用於中止計時器。api

或者說Settimer是設置定時器的,Ontimer是響應Settimer消息的。當Settimer設置的時間到了,就會自動調動Ontimer()函數。函數

先了解下SetTimer這個API函數的原型post

UINT_PTR SetTimer(
  HWND hWnd,              // 窗口句柄
  UINT_PTR nIDEvent,      // 定時器ID,多個定時器時,能夠經過該ID判斷是哪一個定時器
  UINT uElapse,           // 時間間隔,單位爲毫秒
  TIMERPROC lpTimerFunc   // 回調函數
);
例如
SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發一次的定時器
在MFC程序中SetTimer被封裝在CWnd類中,調用就不用指定窗口句柄了
因而SetTimer函數的原型變爲:
UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
當使用SetTimer函數的時候,就會生成一個計時器。
SetTimer函數中
nIDEvent指的是計時器的標識,也就是名字。
nElapse指的是時間間隔,也就是每隔多長時間觸發一次事件。
第三個參數是一個回調函數,在這個函數裏,放入你想要作的事情的代碼,你能夠將它設定爲NULL,也就是使用系統默認的回調函數,系統默認的是OnTime函數。
這個函數怎麼生成的呢?
你須要在須要計時器的類的生成onTime函數:
在ClassWizard裏,選擇須要計時器的類,添加WM_TIME消息映射,就自動生成OnTime函數了。
而後在函數裏添加代碼,讓代碼實現功能。
每隔一段時間(SetTimer設置的時間)就會自動執行一次。
例:
SetTimer(1,1000,NULL);
1:計時器的名稱;
1000:時間間隔,單位是毫秒;
NULL:使用onTime函數。
當不須要計時器的時候調用KillTimer(nIDEvent);
例如:KillTimer(1);  //此處的ID號「1 」應與SetTimer()中的ID號一致
若是須要要加入兩個或者兩個以上的 timer怎麼辦? 
  繼續用SetTimer函數吧,上次的timer的ID是1,此次能夠是2,3,4......
  SetTimer(2,1000,NULL); //ID爲2,定時1000ms   SetTimer(3,500,NULL);   //ID爲3,定時500ms   WINDOWS會協調他們的。固然OnTimer函數體也要發生變化,要在函數體內添加每個timer的處理代碼:    OnTimer(nIDEvent)    {        switch(nIDEvent)        {             case 1:........;                 break;             case 2:.......;                 break;             case 3:......;                 break;         }    }  在控制檯中使用定時器不能簡單的SetTimer了事,這在控制檯裏這種SetTimer的方式是有點麻煩的,須要本身寫消息循環投遞WM_TIMER消息。其實在控制檯裏能夠使用多媒體時鐘來計時:  example:  //啓動計時器  MMRESULT nIDTimerEvent = timeSetEvent(    1000,//延時1秒     0,    TimeProc,    0,    (UINT)TIME_PERIODIC);  if( nIDTimerEvent == 0 )    cout<<"啓動計時器失敗"<<endl;  //回調過程(時鐘到來,回調函數被系統自動調用)  void CALLBACK TimeProc(    UINT uID,          UINT uMsg,        DWORD dwUser,      DWORD dw1,        DWORD dw2        )  {    cout<<"時鐘到來"<<endl;      }    固然了,你要是習慣於SetTimer,那就用SetTimer吧: 下面是我在Console下用SetTimer寫的一個例子: #include <windows.h> #include <iostream> using namespace std; void CALLBACK TimeProc(      HWND hwnd,            UINT message,          UINT idTimer,          DWORD dwTime); int main() {  SetTimer(NULL,1,1000,TimeProc);  MSG   msg;     while(GetMessage(&msg,NULL,0,0))     {      if(msg.message==WM_TIMER)      {       DispatchMessage(&msg);      }     }     return 0; } void CALLBACK TimeProc(      HWND hwnd,            UINT message,          UINT idTimer,          DWORD dwTime)    {    cout<<"a timer comming"<<endl; }
相關文章
相關標籤/搜索