定时器的使用非常广泛:
体育课上,计算田径跑步用时;
军事上,定时炸弹,定时雷管。
生活上,定时器控制开关或工作时间。
下面先说下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.一键开始,此时内容从上次一键继续变为一键开始