MFC定時器


在程序中我們經常要使用定時刷新的功能,典型的應用是在信息管理系統中表單要跟着數據庫中的數據變動。MFC提供了定時器來完成這個功能。

=========================================================================

在MFC中和定時器相關的有三個函數:

UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
afx_msg void OnTimer( UINT nIDEvent );
BOOL KillTimer( int nIDEvent );

 

=========================================================================

參數說明:
UINT nIDEvent:定時器的ID,給定時器唯一的身份驗證,如果在一個程序中有多個定時器可以用這個ID來確定是那個定時器發送的消息。
UINT nElapse: 定義刷新時間,即間隔多長時間刷新一次,單位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):
              這個回調函數中實現刷新時所做的操作,如在數據庫中讀取數據。但是我們大多數時候不在這里實現,而是在OnTimer中。

=========================================================================


函數功能:
SetTimer用來定義一個定時器的屬性,如改定時器的ID,刷新時間,處理函數。
OnTimer實際時系統定義消息用來響應WM_TIMER消息,在這里可以實現對多定時器中的各個定時器分別響應,這里才時定時程序大展宏圖的地方。
KillTimer用來結束一個定時器。

下面我們用一個例子來說明定時器的使用:
   這個例子用來實現一個簡單的功能,就是在一個單文檔程序中,每間隔5秒彈出一個消息框提示“定時器1”,每隔7秒彈出一個消息框提示“定時器2”。
   建立單文檔程序略,一路Next。

=========================================================================

(1)在resource.h中定義兩個定時器的ID

#define IDTIMER1  1
#define IDTIMER2  2

 


(2)在CMainFrame的OnCreate函數中定義兩個定時器的屬性。

SetTimer(TIMEID1,5000,0);
SetTimer(TIMEID2,7000,0);

 

(3) CMainFrame中對WM_TIMER進行響應。

oid CMainFrame::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent) {
    case TIMEID1:
        {   
            AfxMessageBox("定時器1!");
            break;
        }
case TIMEID2:
        {   
            AfxMessageBox("定時器2!");
            break;
        }
    default:
        ;
    }
   
    CFrameWnd::OnTimer(nIDEvent);
}

 

(4)在CMainFrame的析構函數中添加

KillTimer(IDTIMER1);
KillTimer(IDTIMER2);

==============================

參考2

 

當執行到程序的某一行代碼時,需要添加計時器,就用這條語句:

SetTimer(1, 1000, NULL);

參數如下:

UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse,
  void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD));

設置好后計時器立馬生效,1秒后計時器發生中斷,在代碼所在的類中進行捕捉:

1.在該類的消息中添加:

BEGIN_MESSAGE_MAP(CTab1, CDialog)  // CTab1是自己定義的一個類
    ...
    ON_WM_TIMER()
    ...
END_MESSAGE_MAP()

 

2.所在的類中添加成員函數:

void OnTimer(UINT_PTR nIDEvent);

 

 

3.添加函數的代碼,即捕捉后的執行代碼:

void CTab1::OnTimer(UINT_PTR nIDEvent)
{
    switch (nIDEvent)
    {
    case 1:  // 計時器1
               .... // 處理的代碼
               KillTimer(1);  // 刪除此計時器,否則計時器中斷完后會自動重新開始計時,到下一次中斷時還會發生新的中斷
               break;

    case 2:  // 計時器2
               .... // 處理的代碼
               break;
    default:
               MessageBox("default: KillTimer");
               KillTimer(nIDEvent);
               break;
    }
}


免責聲明!

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



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