mfc的定时器功能,可以让程序周期性的执行一些功能。如定时采集数据,刷新界面等。我认为的好处,就是避免了使用多线程去实现那些功能。从而使编程变得更加的简单和可靠 下面介绍如何使用定时器Timer
新建一个mfc项目TestTimer。在主界面上增加一个进度条控件,一个开始按钮和一个停止按钮。实现点击开始按钮,进度条滚动,点击停止按钮,进度条停止滚动。
对进度条右键,点击添加变量
设置变量名为m_progress
双击开始按钮,添加事件处理程序,使用SetTimer创建定时器,其中1是创建的定时器ID,100是每个100毫秒触发一次定时器(发送WM_TIMER消息)
void CTestTimerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1,100,NULL);
}
双击停止按钮,添加事件处理程序,使用KillTimer销毁定时器,1是所要销毁的定时ID。
void CTestTimerDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
KillTimer(1);
}
之后就是通过覆写OnTimer函数来实现定时器触发后的操作,增加进度条滚动进度 在CTestTimerDlg类中声明OnTimer函数
public:
void OnTimer(UINT_PTR nIDEvent);
实现定时器函数,通过switch语句判断不同定时器ID对应的不同操作(可以同时设置多个定时器)
void CTestTimerDlg::OnTimer(UINT_PTR nIDEvent){
switch (nIDEvent)
{
case 1:
if (m_progress.GetPos() < 100)
{
m_progress.SetPos(m_progress.GetPos() + 1);
}else{
m_progress.SetPos(0);
}
break;
default:
break;
}
}
最重要的,建立定时器消息映射。没有以下语句,则即便定时器被成功创建,也不会执行OnTimer函数
BEGIN_MESSAGE_MAP(CTestTimerDlg, CDialog)
...
ON_WM_TIMER()
END_MESSAGE_MAP()
当然也可以自动覆写OnTimer函数,方法是,在类视图中,对CTestTimer类右键,属性,在属性页中,点击消息,找到WM_TIMER,点击添加OnTimer
之后系统会自动生成OnTimer函数,并且建立消息映射,我们只需要在OnTimer函数中写入相关代码就可以了
实现效果
祝大家,六一儿童节快乐!