2024年6月12日发(作者:)

MFC定时器SetTimer函数用法总结

CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数

SetTimer则没有这个限制,这是一个很重要的区别。

1、启动定时器。

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

如下:

参数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

工程的类向导,选择要添加定时器的类,在消息列表中找到WM_TIMER消息,添加消息

处理函数。添加后,cpp文件中会出现类似如下内容:

C++代码

BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)

......

ON_WM_TIMER()

END_MESSAGE_MAP()

void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)

{

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

CDialogEx::OnTimer(nIDEvent);

}

之后就可以在OnTimer函数中进行相应的处理了。OnTimer的参数nIDEvent为

定时器ID,即在SetTimer成员函数中指定的定时器ID,如果有多个定时器,我们可以像

下面这样处理:

C++代码

void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)

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

switch (nIDEvent)

{

case 1:

//在这添加执行定时器1的任务;