在VS2010中新建一个项目,Visual C++->MFC->MFC应用程序,命名为“Timer”->确定,选择MFC向导建立基于对话框; 2. 在自动生成的对话框模板中,删除所有静态文本控件和按钮控件。从右侧工具箱中添加一个编辑框控件和一个按钮控件,使用默认的IDC_EDIT1和IDC_BUTTON1,编辑框的ReadOnly属性设置True。
添加OnTimer() 回调函数:
打开类视图对话框:视图->类视图;
在类视图中点击需要使用定时器的对话框类,在属性窗口选择消息,在下面的消息函数中选中WM_TIMER,后面选择添加OnTimer函数,如下图所示:
窗口添加函数后,在头文件和源文件中自动生成OnTimer函数的声明和定义;
控件操作:
左键点中按钮->外观->Caption->改成"start"
双击按钮:自动生成按钮回调函数 OnBnClickedButtonStart()的声明和定义;
开始编辑代码:
timerDlg.h 文件中添加如下内容
// 将timer id定义成枚举类型,因为每个成员的值可以自动递增
// 如果写成宏的话,每个宏都得写固定的值,当后续想调整顺序的时候,每个宏的值都得改,会比较麻烦
enum{
READ_STATUE_TIMER_ID = 0,
TIMER_ID_1,
TIMER_ID_2,
TIMER_ID3,
};
#define READ_STATUE_MS 1000 // 读取状态定时器周期(单位ms)
// 构造函数的声明中添加
class CtimerDlg : public CDialogEx{
private:
UINT_PTR m_ReadStatuTimer; // 定时器句柄,用于关定时器时使用
BOOL m_bStart; // 是否启动了定时器
int m_nTimerCnt; // 当前计数值
};
timerDlg.cpp 文件中修改如下内容
CtimerDlg::CtimerDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CtimerDlg::IDD, pParent){
// 添加内容
m_pReadStatuTimer = NULL;
m_bStart = FALSE;
m_nTimerCnt = 0;
}
BOOL CtimerDlg::OnInitDialog()
{
// 添加内容
}
void CtimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_nTimerCnt++;
// 更新计数值到EDIT1控件上
CString str;
str.Format(_T("%d"),m_nTimerCnt);
GetDlgItem(IDC_EDIT1)->SetWindowTextW(str);
CDialogEx::OnTimer(nIDEvent);
}
void CtimerDlg::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
m_bStart = !m_bStart;
if (TRUE == m_bStart){
// 如果点了启动,且定时器没开,则打开定时器
if (0 == m_pReadStatuTimer){
m_pReadStatuTimer = SetTimer(READ_STATUE_TIMER_ID, READ_STATUE_MS, 0);
}
// 把按钮显示成stop
GetDlgItem(IDC_BUTTON_START)->SetWindowTextW(_T("stop"));
// 重新计数
m_nTimerCnt = 0;
}
else{
// 如果再点了一次时,关定时器
if (0 != m_pReadStatuTimer){
KillTimer(READ_STATUE_TIMER_ID);
m_pReadStatuTimer = 0;
}
// 把按钮显示成start
GetDlgItem(IDC_BUTTON_START)->SetWindowTextW(_T("start"));
}
}
参考链接: