SetTimer()函數使用


在編程時,會經常使用到定時器。使用定時器的方法比較簡單,通常告訴Windows一個時間間隔,然后WINDOWS以此時間間隔周期性觸發程序。通常有兩種方法來實現:發送WM_TIMER消息和調用應用程序定義的回調函數。

1.1 用WM_TIMER來設置定時器

先請看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類中,調用就不用指定窗口句柄了,例如:

UINT SetTimer(1,100,NULL);
函數反回值就是第一個參數值1,表示此定時器的ID號。

第二個參數表示要等待100毫秒時間再重新處理一次。第三個參數在這種方法中一般用NULL。
注意:設置第二個參數時要注意,如果設置的等待時間比處理時間短,程序就會出問題了。

1.2 調用回調函數

此方法首先寫一個如下格式的回調函數

void CALLBACK TimerProc
(
  HWND hWnd,
  UINT nMsg,
  UINT nTimerid,
  DWORD dwTime
);

然后再用SetTimer(1,100,TimerProc)函數來建一個定時器,第三個參數就是回調函數地址。

二、多個定時器的實現與應用

我們在安裝定時器時都為其指定了ID,使用多個定時器時,該ID就發揮作用了。
不使用MFC時,當接收到WM_TIMER消息,WPARAM wParam中的值便是該定時器的ID
使用MFC時就更簡單了,我們為其增加WM_TIME的消息處理函數OnTimer即可,請看如下例子 

void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
   switch (nIDEvent)
   {
     case 24: ///處理ID為24的定時器
       Draw1();
     break;
     case 25: ///處理ID為25的定時器
       Draw2();
     break;
   }
   CDialog::OnTimer(nIDEvent);
}

當你用回調函數時,我們可以根據nTimerid的值來判斷是哪個定時器,例如:

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
   switch(nTimerid)
   {
   case 1: ///處理ID為1的定時器
         Do1();
         break;
   case 2: ///處理ID為2的定時器
         Do2();
         break;
   }
}

三、取消定時器

不再使用定時器后,我們應該調用KillTimer來取消定時,KillTimer的原型如下

BOOL KillTimer(
   HWND hWnd,          // 窗口句柄
   UINT_PTR uIDEvent   // ID
);

在MFC程序中我們可以直接調用KillTimer(int nIDEvent)來取消定時器。

如:KillTimer(1);

轉自:http://www.cnblogs.com/oskycar/archive/2008/12/02/1346308.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM