很久没弄过mfc了,今天弄了个timer,好多都忘了,重新在网上搜索了下,还算弄出来了。!
用的是vs2010。。 首先创建一个mfc工程,选择基于对话框选项。
在timerDlg.h 头文件里面加入宏定义:
#define IDT_TIMER_0 WM_USER + 200
#define TimerInterval 1000 // 1000 mSec
在对话框上添加2个按钮,并加入按钮响应代码。
初始化并开启timer按钮功能:
void CtimerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//if (IconTimer != NULL)
// StopTimer (IconTimer);
IconTimer = NULL;
IconTimer = SetTimer (IDT_TIMER_0, TimerInterval, NULL);
if(IconTimer == 0)
{
/// 在一个win32窗口程序中,如果第一个参数为NULL,弹出提示消息框,其它菜单仍可以被点
///,而如果指定了hwnd,则不能再点其它,就好像模态对话框一样。
::MessageBox(NULL,"Unable to obtain timer","IDT_TIMER_0",MB_OK|MB_APPLMODAL);
}
}
然后在属性页工具栏上点击Messages按钮,下面列表就列出了所有消息,找到WM_TIMER消息,添加消息处理函数。添加后,cpp文件中会出现类似如下内容:
BEGIN_MESSAGE_MAP(CtimerDlg, CDialogEx)
....
ON_WM_TIMER()
END_MESSAGE_MAP()
void CtimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEx::OnTimer(nIDEvent);
}
完整的OnTimer内容如下:
void CtimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/// 注意这里的第一个参数hWnd 要为NULL,
/// 不然后面的停止 timer 按钮无法按下。
::MessageBox (NULL,"timer ","IDT_TIMER_0",MB_OK);
CDialogEx::OnTimer(nIDEvent);
}
另外一个按钮功能是 kill timer使用
void CtimerDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
if (IconTimer != NULL)
StopTimer (IconTimer);
}
StopTimer可以通过右击类名字的方式添加函数,参数名字 TimerVal,类型 int。是当初SetTimer 的返回值:
int CtimerDlg::StopTimer(int TimerVal)
{
if (!KillTimer(TimerVal))
{
CString Message;
Message.Format("Unable to kill timer: %u", TimerVal);
MessageBox (Message, "StopTimer", MB_OK|MB_SYSTEMMODAL);
return FALSE;
}
return TRUE;
}
运行效果:
点击以下stop就可以 KillTimer了。
需要说明的是,即便在任务管理器把timer进程关闭掉timer依然会定时的调用。除非是kill才能真正的把这个定时器移除~~~!!