MFC 定時器之妙用

    現在有這麼一個問題,在VC編程中,如果要每隔一段時間去響應一個事件,應該怎麼處理?
    1.Sleep(int n)函數;(S 一定要大寫,這個和C不一樣)
   2.WaitForSingleObject()等待函數;
    其中,用Sleep()多的話應該知道,它的時間不是很精確,且會讓程序陷入休眠,而且這個函數其實是VC專門爲線程設計的。而等待函數是需要SetEvent來實現喚醒的。
    還有第三個方法,就是定時器的使用。
   我們知道,在VC的MFC中,已經爲我們封裝好了很多全面和強大的函數集,所以在MFC編程時,巧妙地調用MFC函數庫可以爲我們省去很多麻煩。其中定時器也可以在MFC程序中很好地利用。

    在MFC中和定時器相關的有三個函數:
1.設置定時器(定義一個定時器的屬性):
  SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));
2.定時器響應(響應系統定義WM_TIMER消息):
  OnTimer( UINT nIDEvent );
3.釋放定時器:
  KillTimer( int nIDEvent );
    其中:
UINT nIDEvent:定時器的ID,在一個程序中用這個ID來確定是那個定時器發送的消息。
UINT nElapse: 定義刷新時間,即間隔多長時間刷新一次,單位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):回調函數的參數,實現刷新時所做的操作,一般情況下都設爲0。

    在這裏就用一個簡單的例子來說明定時器在MFC中是如何使用的。

1.建立單文檔程序Timer。

2.在resource.h中定義兩個定時器的ID
#define TIMER1  1
#define TIMER2  2

3.在CMainFrame的OnCreate函數中定義兩個定時器的屬性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);

4.在類視圖中右擊CMainFrame屬性,在消息響應函數中找到WM_TIMER,然後添加響應函數OnTimer()。
void CMainFrame::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
      case TIMER1:
      {   
          AfxMessageBox("定時器1!");
          break;
      }
      case TIMER2:
      {   
          AfxMessageBox("定時器2!");
           break;
      }
      default:
           break;
    }
    CFrameWnd::OnTimer(nIDEvent);
}

5.在CMainFrame的析構函數中添加釋放定時器函數。
KillTimer(TIMER1);
KillTimer(TIMER2);

    這樣,一個簡單的定時器程序就生成了,運行後可以看到,每隔3秒就會彈出一個消息對話框“定時器1”,每隔5秒就會彈出一個消息對話框“定時器2”。

    這種情況是在程序運行後定時器就直接啓動了,很多時候我們需要的是在響應一次事件或者說點擊一個按鈕後再去執行定時器,那麼這時應該怎麼修改呢?也用一個實例來說明吧,因爲我覺得可能說一大堆廢話也抵不上一個簡單而正確的實例更具說服力。
    現在,我生成了一個MFC多文檔應用程序,我希望在點擊菜單條上的某個按鈕後再去執行定時器。這時就不是在CMainFrame裏面操作了,因爲我們是要在對話框上進行定時器的操作,而CView這個類是負責對話框的對應操作,所以要把定時器定義在CView裏面。

1.建立多文檔程序Timer。

2.在resource.h中定義兩個定時器的ID
#define TIMER1  1
#define TIMER2  2

3.在CTimerView的OnInitialUpdate函數中定義兩個定時器的屬性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);

4.在類視圖中右擊CTimerView屬性,在消息響應函數中找到WM_TIMER,然後添加響應函數OnTimer()。
void CTimerView::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    //Hwnd爲一個變量,初始值爲false,點擊某個按鈕後在其響應函數中將其置爲true
    switch(nIDEvent && Hwnd){
      case TIMER1:
      {   
          AfxMessageBox("定時器1!");
          break;
      }
      case TIMER2:
      {   
          AfxMessageBox("定時器2!");
           break;
      }
      default:
           break;
    }
    CFrameWnd::OnTimer(nIDEvent);
}

5.在CTimerView中添加OnDestroy()函數,在函數中釋放定時器。
KillTimer(TIMER1);
KillTimer(TIMER2);

    現在,運行程序後,沒有馬上彈出預定的對話框,而是在我們點擊某個按鈕或者響應某個事件後對話框才彈出,同樣是點擊按鈕後,每隔3秒彈出對話框“定時器1”,每隔5秒彈出“定時器2”。
    其實在不同的類,定時器的用法都是基本一致的,只要找到類的初始函數和釋放函數,就能輕鬆實現定時功能了,就這麼簡單。
發佈了33 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章