在程序中我們經常要使用定時刷新的功能,典型的應用是在信息管理系統中表單要跟着數據庫中的數據變動。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; } }
