计时器没有你想的那么麻烦,只要了解计时器是什么,它的三个参数是什么就好了。推荐博客园的这些文章:
利用MFC写一个计时器小程序(DelmoreZhu)
MFC常用类:定时器Timer(鸡啄米)
SetTimer简介
MFC没有自带的时钟,时钟长什么样需要你自己设置,计时器是说每隔多少时间执行一次自定义操作。但是MFC自带了两个函数,SetTimer和KillTimer。不需要另加头文件,直接用。
SetTimer(1, 1000, NULL);
计时器不是控件,所以没有那些一般的设置,在类向导看不到ID,它的ID是你自己设置的,就是它的第一个参数,可以设数字,可以是一般的ID名,像ID_TIMER1。
第二个参数是间隔时间。单位为毫秒,1s=1000ms。第二个参数是说,每隔这么多时间执行一次第三个参数的函数。
对,第三个参数是函数操作,如果是NULL,就是OnTimer函数,可以在类向导选,也可以自己在对话框类里加。
OnTimer函数
void CSudoku2Dlg::OnTimer(UINT_PTR nIDEvent);
类向导里选择“消息” -> WM_TIMER ->“添加处理程序” -> “编辑代码”,就会有这个函数。
示例
下面举例的设置为:编辑框显示用时,单位为秒,带勾选框和暂停键。暂停按钮的文本可以在“暂停”和“继续”间切换。在点击“新游戏”后就已开始计时,勾选框只决定显示或不显示,不显示时为0。在SetTimer后不KillTimer我也不知道会怎样,你可以看看其他人的博客里说的把KillTimer放到OnDestroy里。
// 勾选框
void CSudoku2Dlg::OnBnClickedCheck1()
{
// TODO: 在此添加控件通知处理程序代码
if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1)) //你要知道勾选框是动作 不是状态
{
// 勾选
CString cstr("显示计时");
MessageBox(cstr);
SetTimer(1,1000,NULL); //计时器的三个参数:ID,间隔,函数,NULL就是OnTimer函数
}
else {
KillTimer(1);
CString t; //加值类型CString变量也行
t = "0";
SetDlgItemText(IDC_EDIT1, t); //CString类型的0就是空格吗 嗯不是
}
}
暂停按钮:
在.h文件里定义一个全局变量:
bool suspend = FALSE;
void CSudoku2Dlg::OnBnClickedButton8() // 暂停
{
// TODO: 在此添加控件通知处理程序代码
suspend = !suspend;
if (suspend)
{
int a = GetTickCount();
int b = a - starttime;
starttime = b;
spendtime /= 1000;
CString tt;
tt.Format(_T("%ld"), spendtime);
GetDlgItem(IDC_BUTTON8)->SetWindowText(L"继续");
KillTimer(1);
//CString cstr("已暂停");
//MessageBox(cstr);
UpdateData(FALSE);
}
else
{
int a = GetTickCount();
int b = a - starttime;
starttime = b;
GetDlgItem(IDC_BUTTON8)->SetWindowText(L"暂停");
//CString cstr("已继续");
//MessageBox(cstr);
SetTimer(1, 1000, NULL);
}
}
自定义函数:
void CSudoku2Dlg::OnTimer(UINT_PTR nIDEvent) //计时器操作
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int current= GetTickCount();
spendtime = current - starttime;
spendtime /= 1000;
CString tt;
tt.Format(_T("%ld"), spendtime);
SetDlgItemText(IDC_EDIT82, tt);
CDialogEx::OnTimer(nIDEvent);
}
其他博主的博客有说多个计时器时,在这个函数里用switch区分操作。
已经很具体了,再多说一些,就是获得用时。定义全局变量starttime和spendtime,在你的“新游戏”和“重玩”按钮函数的最后面加上:
starttime = GetTickCount();
///SetTimer(1,1000,NULL);
OnBnClickedCheck1(); // 还可以这样
在判断游戏通过之后:
CString cstr("已正确完成,用时");
CString cstr2("ms");
spendtime = GetTickCount() - starttime;
CString t;
t.Format(_T("%ld"),spendtime);
CString aa = cstr + t+cstr2;
MessageBox(aa);
SetDlgItemText(IDC_EDIT1, t);
KillTimer(1);