MFC定时器Timer的使用

mfc的定时器功能,可以让程序周期性的执行一些功能。如定时采集数据,刷新界面等。我认为的好处,就是避免了使用多线程去实现那些功能。
下面介绍如何使用定时器Timer

相关函数

启动定时器

UINT_PTR SetTimer(
  [in, optional] HWND      hWnd,
  [in]           UINT_PTR  nIDEvent,
  [in]           UINT      uElapse,
  [in, optional] TIMERPROC lpTimerFunc
);

终止定时器

BOOL KillTimer(
  [in, optional] HWND     hWnd,
  [in]           UINT_PTR uIDEvent
);

响应定时器的办法:定义Timerproc函数传入SetTimer的lpTimerFunc参数

TIMERPROC Timerproc;

void Timerproc(
  HWND unnamedParam1,
  UINT unnamedParam2,
  UINT_PTR unnamedParam3,
  DWORD unnamedParam4
)
{...}

如果 lpTimerFunc 为 NULL,系统会将 WM_TIMER消息发布到应用程序队列,对于mfc应用程序,只需要在OnTimer函数中进行处理就可以了

使用方法

用定时器实现进度条滚动

使用定时器的例子:
新建一个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

通过覆写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函数中写入相关代码就可以了

定时器效果

在这里插入图片描述
祝大家,六一儿童节快乐!

警告

对于需要频繁刷新的情况,定时器满足不了要求。如果你尝试把周期设置为1ms,你发现1s内最多重复几百次而不是1000次。这也是为什么游戏窗口使用的是游戏循环而不是定时器。

  • 11
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百口可乐__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值