MFC中OnTimer的應用

jerrytung發表於2010-07-28

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

SetTimer, KillTimer()和OnTimer().

粗略的說,Settimer是設定一個計時器並開始執行計時器Ontimer中的程式碼,Ontimer是計時器所執行的程式碼。KillTimer用於停止計時器。

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

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

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;
}

相關文章