MFC中两种定时器

论坛 期权论坛 脚本     
匿名技术用户   2021-1-7 06:30   11   0

在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);

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP