vc++MFC 定时器

vc++MFC 定时器,第1张

在/doc/">程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动。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,给定时器唯一的身份验证,如果在一个/doc/">程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息

UINT nElapse:搭锋塌 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。

void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):

这个回调函数中实现刷新时所做的 *** 作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。

函数功能:

SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。

OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别基洞响应,这里才时定时/doc/">程序大展宏图的地方。 字串2

KillTimer用来结束一个定时器。 字串1

下面我们用一个例子来说明定时器的使用:

这个例子用来实现一个简单的功能,就是在一个单/doc/">文档/doc/">程序中,每间隔5秒d出一个消息框提示“定时器1”,每隔7秒d出一个消息框知圆提示“定时器2”。

建立单/doc/">文档/doc/">程序略,一路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进行响应。

void CMainFrame::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

switch(nIDEvent) {

case TIMEID1:

{

AfxMessageBox("定时器1!")

break

} 字串1

case TIMEID2:

{

AfxMessageBox("定时器2!")

break

}

default:

}

CFrameWnd::OnTimer(nIDEvent)

}

(4)在CMainFrame的析构函数中添加

KillTimer(IDTIMER1)

KillTimer(IDTIMER2)

定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系统传入一个时间烂清间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动 *** 作。例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为1个小时,那么每隔1个小时系统就会采集一次数据,这样就可以在无人 *** 作的情况下准确的进行 *** 作。

MFC定时器

VS2010编程中,我们可以使用MFC的CWnd类提供的成员函数SetTimer实现定时器功能,也可以使用Windows API函数SetTimer来实现。两者使用方法实际上很类似,但也有不同。

CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。因为本教程主要是讲解MFC编程,所以这里就先重点讲解MFC定时器的用法,关于API函数SetTimer的用法鸡啄米会在MFC定时器讲解的基础上进行延伸。

启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下:

UINT_PTR SetTimer(

UINT_PTR nIDEvent,

UINT nElapse,

void (CALLBACK* lpfnTimer

)(HWND,

UINT,

UINT_PTR,

DWORD

)

)

参数nIDEvent指定一个非零的定时器ID;参数nElapse指定间隔时间,单位为毫秒;参数lpfnTimer指定一个回调函数的地址,如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。

通过SetTimer成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过WM_TIMER消息的消息响应函数,一种是通过回调函数。

如果要启动多个定时器燃孙就多次调用SetTimer成员函数。饥段前另外,在不同的CWnd中可以有ID相同的定时器,并不冲突。

2、为WM_TIMER消息添加消息处理函数,或者定义回调函数。

如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER的消息处理函数来处理定时事件。添加WM_TIMER消息的处理函数的方法是,在VS2010工程的Class View类视图中找到要添加定时器的类,点击右键,选择Properties,显示其属性页,然后在属性页工具栏上点击Messages按钮,下面列表就列出了所有消息,找到WM_TIMER消息,添加消息处理函数。

SetTimer函数的用法

1 )用WM_TIMER来设置定时器

先请看SetTimer这个API函数的原型

UINT_PTR SetTimer(

HWND hWnd, // 窗口句柄

UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器

UINT uElapse,// 时间间隔,单位为毫秒

TIMERPROC lpTimerFunc// 回调函数

)

例如

SetTimer(m_hWnd,1,1000,NULL)//一个1秒触发一次的定时器

在MFC程序中SetTimer被封装辩枯在CWnd类中,调用就不用指定窗口句柄了

于是SetTimer函数的原型变为:

UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))

当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,

也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,

也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要猜嫌计时器的类的生成onTime函数:

在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。

每隔一段时间就会自动执行一次。

例:

SetTimer(1,1000,NULL)

1:计时器的名称;

1000:时间间隔,单位是毫秒;

NULL:使用onTime函数。

当不需要计时器的时候调用KillTimer(nIDEvent)

例如:KillTimer(1)

2) 调用回调函数

此方法首先写一个如下格式的回调函数

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)

然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?

继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。

SetTimer(2,1000,NULL)

SetTimer(3,500,NULL)

嗯,WINDOWS会协调他们的。当然onTimer函数体也要发穗灶手生变化,要在函数体内添加每一个timer的处理代码:

onTimer(nIDEvent)

{

switch(nIDEvent)

{

case 1:........

break

case 2:.......

break

case 3:......

break

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11995002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存