【参考资料:http://blog.csdn.net/weiwenhp/article/details/8733216】
【使用MFC的情况下】
示例1,使用消息处理
新建一个MFC project,类型选Dialog,
先设定下多久
//TimerTestDlg.h///
afx_msg void OnTimer(UINT_PTR nIDEvent); //回调函数,这里的函数名OnTimer不能换成其他名字.固定的
TimerTestDlg.cpp//
#include "afxmt.h"
#define TIMERID 8 //指定一个timer的ID,你可以同时设定多个timer,就用ID来区分
CCriticalSection g_criSection; //【阿甘补充:在这里使用了一个关键区对象】
BEGIN_MESSAGE_MAP(CTimerTestDlg, CDialog)
ON_WM_TIMER()
END_MESSAGE_MAP()
BOOL CTimerTestDlg::OnInitDialog()
{
SetTimer(TIMERID,1000,0); //这里就相当于设定了timer,如果要停掉timer就是KillTimer(TIMERID)
}
void CTimerTestDlg::OnTimer(UINT_PTR nIDEvent)
{
g_criSection.Lock();
static int nShowNum = 1;
if( nIDEvent == 8) // 【阿甘补充:注意Timer序号的一一对应。否则无响应】
{
CString strInfo;
strInfo.Format("I am number %d", nShowNum);
GetDlgItem(IDC_STATIC)->SetWindowText(strInfo); //假如有一个text control ,用来显示数字
}
g_criSection.Unlock();
}
SetTimer 与 KillTimer的定义
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
每一个参数表示timer id,用来区分不同的timer,假如同时定义了几个timer,在OnTimer()中做不同处理时,可以判断nIDEvent是哪一个.
nElapse表示多长时间执行一次,单位是毫秒,1000就是一秒.
lpfnTimer是回调函数,上面的示例是写成0,表示不显式指定回调函数,这样就是是调用OnTimer,如果你显式指定了回调函数,则OnTimer()函数就不会被调用了.
BOOL KillTimer( int nIDEvent);
直接通过timer id就停掉timer就行了.
示例2,直接指定回调函数
void CALLBACK Test(HWND hWnd,UINT para1,UINT_PTR para2,DWORD para3)
{
}
BOOL CTimerTestDlg::OnInitDialog()
{
SetTimer(TIMERID,1000,Test); //直接调用Test,这样之前写的OnTimer函数就永远不会被调用到了.
}
【不使用MFC,直接调用API】
Win32 中的timer
上面讲的SetTimer和KillTimer是类CWnd中的方法,只要继承自它的窗口类都可以使用.
不过如果不是窗口类中也可以用timer,使用API的全局函数
UINT SetTimer(
HWND hWnd, UINT nIDEvent, UINT uElapse,TIMERPROC lpTimerFunc);
其中后面三个参数跟上面的一样,只是多了个参数hWnd,指定一个窗口类的句柄.
同样KillTimer也只是多了这一个参数
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);