http://www./dev/vc/2009-11-15/a09119886.shtml
定時器在Windows 的程序中的作用不可忽略,也隨處可見。設定一個時間間隔每0.5秒或者1秒鐘刷新一次時鐘,這樣就可以完成一個簡單的電子鐘程序。在不同的編程工具中定時器的用法也不同,Visual C++中也給我們提供了實現這種功能的方法,而且方法不只一種。在窗口類中是使用定時器比較很簡單,用SetTimer()設置了定時器之后,并在Class Wizard中添加了WM_TIMER消息映射后,您就可以在映射函數OnTimer()中添加代碼實現,來定時完成您的任務,而且還支持任意多個定時器,這種方法大家可能都會用。但是在非窗口的類中,使用定時器就沒那么簡單了,在類消息映射中就找不到OnTimer()方法了,類中也沒有hWnd這個屬性,SetTimer()也不能象原來那樣使用了,下面給出了一種既不破壞類的完整性的同時又能巧妙的使用定時器的方法。程序運行后的界面效果如圖一所示:
圖一、定時器界面效果圖 | 實現方法 在非窗口類中使用定時器,需要了解的知識比較多。首先非窗口類中沒有消息映射,也沒有象CWnd類具有的SetTimer()方法來設置定時器。沒有消息映射,就只能靠我們自己定義的回調函數來處理定時器的消息,因此大家有必要了解一下回調函數的概念。因為回調函數只能用全局函數或者靜態(tài)成員函數來實現,而為了維持類的完整性,又要求使用類的靜態(tài)成員函數來作為回調函數。又因為定時器是在我們的程序中產生的,這又需要來管理定時器,所以又用到了映射表類CMap。
程序代碼 CMyTimer,該類的作用是每隔一段時間提醒我們做某件事情,然后用這個類創(chuàng)建N個實例,每個實例以不同的時間間隔提醒我們做不同的事情。
/////////////////////////////////////////// MyTimer.h: interface for the
CMyTimer class. #if
!defined(AFX_MYTIMER_H__D97674D1_B221_49CD_9637_4CBA8C3180CE__INCLUDED_) #define
AFX_MYTIMER_H__D97674D1_B221_49CD_9637_4CBA8C3180CE__INCLUDED_ #include
<afxtempl.h> #if _MSC_VER > 1000 #pragma once #endif //
_MSC_VER > 1000 class CMyTimer; typedef
CMap<UINT,UINT,CMyTimer*,CMyTimer*> CTimerMap; class CMyTimer
{ public: //設置定時器,nElapse表示時間間隔,sz表示要提示的內容 void
SetMyTimer(UINT nElapse,CString sz); //銷毀該實例的定時器 void
KillMyTimer(); //保存該實例的定時器標志值 UINT m_nTimerID; //靜態(tài)數據成員要提示的內容
CString szContent; //靜態(tài)數據成員,映射表類,用于保存所有的定時器信息 static CTimerMap
m_sTimeMap; //靜態(tài)成員函數,用于處理定時器的消息 static void CALLBACK MyTimerProc(HWND
hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
CMyTimer(); virtual
~CMyTimer(); }; #endif
/////////////////////////////////////
MyTimer.cpp: implementation of the CMyTimer class. #include
"stdafx.h" #include "TimerDemo.h" #include "MyTimer.h" #ifdef
_DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new
DEBUG_NEW #endif CTimerMap
CMyTimer::m_sTimeMap;
CMyTimer::CMyTimer() { m_nTimerID =
0; }
CMyTimer::~CMyTimer() {}
void CALLBACK
CMyTimer::MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD
dwTime) { CString
sz; sz.Format("%d號定時器:%s",idEvent,m_sTimeMap[idEvent]->szContent); AfxMessageBox(sz); }
void
CMyTimer::SetMyTimer(UINT nElapse,CString sz) { szContent =
sz; m_nTimerID =
SetTimer(NULL,NULL,nElapse,MyTimerProc); m_sTimeMap[m_nTimerID] =
this; }
void
CMyTimer::KillMyTimer() { KillTimer(NULL,m_nTimerID); m_sTimeMap.RemoveKey(m_nTimerID); }
|
(#)
|