在MFC中有两种定时器:
一、自定义回调函数的定时器,如设置定时器函数原型:
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
回调函数函数格式为:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
例子:
创建一个对话框工程,然后在对话框中添加两个按钮,分别为开始定时和结束定时(以下是自己添加的代码)
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
TRACE("开始定时\n");
}
void CSetTimeDlg::OnButton1() //按钮开始定时
{
// TODO: Add your control notification handler code here
SetTimer(1,1000,TimerProc);
}
void CSetTimeDlg::OnButton2() //结束定时器
{
// TODO: Add your control notification handler code here
MessageBox("定时器结束");
KillTimer(1);
}
由于TimerProc定义的是全局函数,使用MessageBox时会出错,我就使用TRACE代替,那么这就需要调试时才能看到效果。
二、不使用回调函数,如设置定时器函数原型:
UINT_PTR SetTimer(
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
第三个参数可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
如:
SetTimer(1,1000,NULL);
1:计时器的名称;
1000:时间间隔,单位是毫秒;
NULL:使用onTime函数。
当不需要计时器的时候调用KillTimer(nIDEvent);
例如:KillTimer(1);
例子:
创建一个对话框工程,然后在对话框中添加两个按钮,分别为开始定时和结束定时(以下是自己添加的代码)
void CSetTimeDlg::OnButton1() //按钮开始定时
{
// TODO: Add your control notification handler code here
SetTimer(1,2000,NULL);
}
void CSetTimeDlg::OnTimer(UINT nIDEvent) //定时器
{
// TODO: Add your message handler code here and/or call default
MessageBox("开始定时器");
CDialog::OnTimer(nIDEvent);
}
void CSetTimeDlg::OnButton2() //结束定时器
{
// TODO: Add your control notification handler code here
MessageBox("定时器结束");
KillTimer(1);
}