界面学习笔记(3)MFC计时器

计时器没有你想的那么麻烦,只要了解计时器是什么,它的三个参数是什么就好了。推荐博客园的这些文章:
利用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);

猜你喜欢

转载自blog.csdn.net/qq_43144103/article/details/105866392