MFC---定时器的使用【定时器并行】

31 篇文章 2 订阅
定时器的使用非常广泛:
体育课上,计算田径跑步用时;
军事上,定时炸弹,定时雷管。
生活上,定时器控制开关或工作时间。

下面先说下MFC定时器的具体使用方法,然后再演示一个定时器的具体案例。

一: 定时器的使用:

1.定时器的开启:

使用CWnd类的成员函数SetTimer():
 SetTimer
  (
       UINT nIDEvent, //定时器ID,用来确定消息是那个定时器发送的。
       UINT nElapse,  // 定义刷新时间,即间隔多长时间刷新一次,实现周期性的自动操作。单位是毫秒ms。
       void (CALLBACK EXPORT* lpfnTimer)
    	(HWND,UINT,UINT,DWORD)  // 回调函数的参数,实现刷新时所做的操作,一般都设为0。
   );

         

2.定时器的响应:

系统定义WM_TIMER()消息:
void xxxDlg::OnTimer( UINT nIDEvent )
{
// TODO: Add your message handler code here and/or call default 

 CDialog::OnTimer(nIDEvent);
};

1.定时器的销毁:
使用CWnd类的KillTimer()成员函数:

 BOOL KillTimer(UINT_PTR nIDEvent);   // 指定将要被销毁的定时器ID。

二: 定时器的案例【TimeTrigger】

案例说明:使用2个定时器并行工作,通过 nIDEvent 来区分是哪个定时器需要进行哪些操作。

		定时器1 :向上计时,从零开始往上计数
		定时器2:往下计时-----倒计时
		
		一键开始:同时开启2个定时器
		一键重置:同时重置2个定时器
		一键停止:同时停止2个定时器

如图:
在这里插入图片描述
步骤:
1.建立一个MFC对话框应用程序,添加2个Static静态文本,用来显示时间,分别为他们关联一个控件变量 m_TimeDisplay、m_TimeDisplay2,修改ID,如图:

在这里插入图片描述
2.添加9个按钮:2个开始、2个重置、2个停止、1个一键开始、1个一键重置、1个一键停止
并为它们添加相应的按钮函数,相应的函数和具体实现方法如下面代码,将以注释的模式进行标示:
具体代码:

//左边开始按钮:启动定时器1 ---向上计时
void CTimeTriggerDlg::OnBTN_TimeKeepingUp() 
{
 	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("开始"));
	//开器定时器1
	SetTimer(1,10,NULL);
	
}


//右边开始按钮:启动定时器2---倒计时
void CTimeTriggerDlg::OnBTNCountDown() 
{	
	//按钮内容
	SetDlgItemText(IDC_BTN_CountDown,_T("开始")); 

	//开器定时器2
	SetTimer(2,10,NULL);
}

//定时器具体操作:2个定时器共用一个OnTimer()函数,通过ID区分
void CTimeTriggerDlg::OnTimer(UINT nIDEvent) 
{
//定时器1相关变量:
	static UINT mm = 0;  //分钟数
	static UINT ss = 0;	  //秒数
	static UINT mss = 0;  //毫秒秒数
	CString str;
	
//定时器2相关变量:
	static UINT mm2 = 10;
	static UINT ss2 = 60;
	static UINT mss2 = 100;
	CString str2;

	switch(nIDEvent)  //定时器ID
	{

	case 1:  //定时器ID : 1---向上计时
		{

			
			mss++;  //递增
			if (mss == 100)
			{
				mss = 0;
				ss++;
			}
			if (ss == 60)
			{
				ss =0;
				mm++;
			}
			
            //设置静态文本的显示
			str.Format(_T("%02i : %02i : %02i"),mm,ss,mss);
			m_TimeDisplay.SetWindowText(str);
			break;
			
		}
	case 2:  //定时器ID : 2---倒计时
		{
			mss2--;   //递减
			if (mss2 == 0)
			{
				mss2 = 100;
				ss2--;
			}
			if (ss2 == 0)
			{
				ss2 =60;
				mm2--;
			}
			
 			//设置静态文本的显示
			str.Format(_T("%02i : %02i : %02i"),mm2,ss2,mss2);
			m_TimeDisplay2.SetWindowText(str);
			break;
		
		}
		
	}

	CDialog::OnTimer(nIDEvent);
}

//左边重置:停止(销毁)定时器1 ---向上计时销毁
void CTimeTriggerDlg::OnBTNReSet1() 
{

	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("开始"));
	
	//停止
	KillTimer(1);

	//重置时间
	m_TimeDisplay.SetWindowText(_T("00 : 00 : 00"));
	
}

//右边重置:停止(销毁)定时器2 ---倒计时销毁
void CTimeTriggerDlg::OnBTNReset2() 
{
	//按钮内容
	SetDlgItemText(IDC_BTN_CountDown,_T("开始"));
	
	//停止
	KillTimer(2);
	
	//重置时间
	m_TimeDisplay2.SetWindowText(_T("00 : 00 : 00"));
}

//左边停止:停止计时1
void CTimeTriggerDlg::OnBTNStop() 
{
	
	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("继续"));
	
	//开始
	KillTimer(1);
}

//右边停止:停止计时2
void CTimeTriggerDlg::OnBTNStop2() 
{
	//按钮内容
	SetDlgItemText(IDC_BTN_CountDown,_T("继续")); 

	//停止
	KillTimer(2);
}



//一键开启计时
void CTimeTriggerDlg::OnBTN_AllStart() 
{
	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("开始")); 
	SetDlgItemText(IDC_BTN_CountDown,_T("开始")); 
	SetDlgItemText(IDC_BUTTON1,_T("一键开始")); 
	
	//开始
	SetTimer(1,10,NULL);
	SetTimer(2,10,NULL);
}


//一键重置
void CTimeTriggerDlg::OnBTN_AllReset() 
{

	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("开始")); 
	SetDlgItemText(IDC_BTN_CountDown,_T("开始")); 
	SetDlgItemText(IDC_BUTTON1,_T("一键开始")); 
	
	//停止
	KillTimer(1);
	KillTimer(2);

	//重置
	m_TimeDisplay.SetWindowText(_T("00 : 00 : 00"));
	m_TimeDisplay2.SetWindowText(_T("00 : 00 : 00"));

}

//一键停止
void CTimeTriggerDlg::OnBTN_AllStop() 
{

	//按钮内容
	SetDlgItemText(IDC_BUTTON2,_T("继续")); 
	SetDlgItemText(IDC_BTN_CountDown,_T("继续"));
	SetDlgItemText(IDC_BUTTON1,_T("一键继续"));
	 
   //停止
	KillTimer(1);
	KillTimer(2);

}

运行:

1.一键开始:
在这里插入图片描述

2.一键重置:

在这里插入图片描述
3.一键停止:此时内容从上次一键开始变为一键继续:从上次停止的时间继续计时,不清零:

在这里插入图片描述
4.一键开始,此时内容从上次一键继续变为一键开始
在这里插入图片描述

结语:谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随心漂流

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

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

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

打赏作者

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

抵扣说明:

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

余额充值