vs2010定时器如何使用?

德赛法 2017-09-09 04:25:35
1、创建基于对话框的工程,名称设为“Example44”。
2、在自动生成的对话框模板IDD_EXAMPLE44_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件。添加两个静态文本框控件,Caption分别设为“1秒钟刷新一次”和“2秒钟刷新一次”,再添加两个个Edit Control控件,ID使用默认的IDC_EDIT1和IDC_EDIT2,两者的Read Only属性都设为True。此时的对话框模板如下图:

3、为CExample44Dlg类添加两个成员变量,分别为m_nData1、m_nData2,并在CExample44Dlg类的构造函数中初始化:
C++代码
1. CExample44Dlg::CExample44Dlg(CWnd* pParent /*=NULL*/)
2. : CDialogEx(CExample44Dlg::IDD, pParent)
3. {
4. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
5. // 两个数据初始化为0
6. m_nData1 = 0;
7. m_nData2 = 0;
8. }
4、在对话框模板上双击OK按钮,添加点击消息的处理函数,并修改如下:
C++代码
1. void CExample44Dlg::OnBnClickedOk()
2. {
3. // TODO: Add your control notification handler code here
4. // 启动ID为1的定时器,定时时间为1秒
5. SetTimer(1, 1000, NULL);
6. // 启动ID为2的定时器,定时时间为2秒
7. SetTimer(2, 2000, NULL);
8.
9. //CDialogEx::OnOK();
10. }
这样,点击OK按钮时就不会退出,而是启动两个定时器。
5、根据上面MFC定时器讲解中为WM_TIMER消息添加处理函数的方法,添加WM_TIMER的消息处理函数OnTimer,并修改其实现如下:
C++代码
1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
2. {
3. // TODO: Add your message handler code here and/or call default
4. switch (nIDEvent)
5. {
6. case 1:
7. // 如果m_nData1已经达到10,则销毁ID为1的定时器
8. if (10 == m_nData1)
9. {
10. KillTimer(1);
11. break;
12. }
13. // 刷新编辑框IDC_EDIT1的显示
14. SetDlgItemInt(IDC_EDIT1, ++m_nData1);
15. break;
16. case 2:
17. // 如果m_nData1已经达到5,则销毁ID为2的定时器
18. if (5 == m_nData2)
19. {
20. KillTimer(2);
21. break;
22. }
23. // 刷新编辑框IDC_EDIT2的显示
24. SetDlgItemInt(IDC_EDIT2, ++m_nData2);
25. default:
26. break;
27. }
28.
29. CDialogEx::OnTimer(nIDEvent);
30. }
6、运行程序,点击OK按钮,查看效果。
[i][i]
[/i][/i]
上面的步骤来自鸡啄米的VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)
我现在想更改一下代码实现这个功能:我点击ok按钮,edit control控件中内容重新从0开始刷新计时,每点击一次ok按钮都是这样。
以下是我更改的情况:
我把void CExample44Dlg::OnBnClickedOk()修改了一下,其余没动。
void CExample44Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
int m_nData1(0);
int m_nData2(0);
SetDlgItemInt(IDC_EDIT1, m_nData1);
SetDlgItemInt(IDC_EDIT2, m_nData2);

KillTimer(1);
KillTimer(2);
// 启动ID为1的定时器,定时时间为1秒
SetTimer(1, 1000, NULL);
// 启动ID为2的定时器,定时时间为2秒
SetTimer(2, 2000, NULL);

//CDialogEx::OnOK();
}
运行后,并没有出现我想要的功能,即我点击ok按钮,edit control控件中内容只是一闪而过变为0,然后仍然按照先前的计时时间继续刷新计时,好像是有记忆似的。
能否分析一下原因,并且修改一下代码以实现我想要的功能?
...全文
1575 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
德赛法 2017-09-14
  • 打赏
  • 举报
回复
void CExample44Dlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//KillTimer(1); 
	//KillTimer(2);//KillTimer(1),KillTimer(2)注释掉与否并不影响。
	/*int */m_nData1=0;
	/*int */m_nData2=0;//竟然把int注释掉就可以了!
	SetDlgItemInt(IDC_EDIT1, m_nData1);
	SetDlgItemInt(IDC_EDIT2, m_nData2);

	SetTimer(1, 1000, NULL); // 启动ID为1的定时器,定时时间为1秒     
	SetTimer(2, 2000, NULL); // 启动ID为2的定时器,定时时间为2秒      

	//CDialogEx::OnOK();
}
终于自己瞎改改成功了。实际上,在void CExample44Dlg::OnBnClickedOk()我不应该重新定义并初始化变量m_nData1和m_nData2,因为这两个变量在头文件中已经定义过了。先前犯的错误就是再次定义变量m_nData1和m_nData2,这相当于在被调用函数中(void CExample44Dlg::OnBnClickedOk())定义了一个与主函数中同名的形参。各位请注意,形参是不能将自身的值传递给主函数的,一旦被调用函数执行完(即我点击ok按钮后调用回调函数void CExample44Dlg::OnBnClickedOk()),形参的数值就会消失。在我先前犯的错误中,我们发现,回调函数oid CTestDlg::OnTimer(UINT nIDEvent)中的变量m_nData1和m_nData2是接收不到来自void CExample44Dlg::OnBnClickedOk()中变量的值的(形参呀),所以,当我们点击ok按钮时,编辑控件中只会闪一下0,然后继续按照本来的值增加计时。历时5天,终于把这个问题解决了。加深了自己对于形参与实参的理解。可以结贴了。感谢上面几楼对我的回复。由于初次使用csdn这个网站,不知道怎么@上面几位好人,在此结贴感谢他们了。
德赛法 2017-09-14
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
问题在 KillTimer(1); KillTimer(2); // SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); 在同一个 函数 中 , 是不是 还没有 Kill 掉?
我想到了这样的一种可能问题,即我在CExample44Dlg::CExample44Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CExample44Dlg::IDD, pParent) 中定义的“6. m_nData1 = 0; 7. m_nData2 = 0; ”与在void CTestDlg::OnOK() 中定义并初始化的“ m_nData1 = 0; m_nData2 = 0;”也许并不是同一个位置上的变量,可能只是同名而已,这样就能解释我点击ok按钮不能实现从0重新开始计时的现象了。虽然对这种问题的猜想解答可能是对的,我却不知道怎样改写,如何纠正是个麻烦的事情
德赛法 2017-09-14
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
问题在 KillTimer(1); KillTimer(2); // SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); 在同一个 函数 中 , 是不是 还没有 Kill 掉?
什么意思?是说要在另外一个函数中KillTimer吗?我在void CTestDlg::OnOK() 中加KillTimer就是为了点击ok按钮时能够kill掉timer,从而实现编辑控制框中的数字重新开始计时,但是结果就是不行。我应该如何改呢?可以麻烦你按照我的想法在自己的电脑上实验一下吗?
schlafenhamster 2017-09-14
  • 打赏
  • 举报
回复
问题在 KillTimer(1); KillTimer(2); // SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); 在同一个 函数 中 , 是不是 还没有 Kill 掉?
德赛法 2017-09-14
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); 前 加 Sleep(1000);
注意看原文要求,黑体字部分::“我现在想更改一下代码实现这个功能:我点击ok按钮,edit control控件中内容重新从0开始刷新计时,每点击一次ok按钮都是这样。”
德赛法 2017-09-14
  • 打赏
  • 举报
回复
引用 4 楼 lonelyhacker 的回复:

void CTestDlg::OnOK() 
{
	// TODO: Add extra validation here
	KillTimer(1);
	KillTimer(2);
	m_nData1 = 0;
	m_nData2 = 0;
	SetDlgItemInt(IDC_EDIT1, m_nData1);
	SetDlgItemInt(IDC_EDIT2, m_nData2);

	SetTimer(1, 1000, NULL);
	SetTimer(2, 2000, NULL);
//	CDialog::OnOK();
}

void CTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch (nIDEvent)
	{
	case 1:
		if(10 == m_nData1)
		{   
			KillTimer(1);   
			break;   
		}   
		SetDlgItemInt(IDC_EDIT1, ++m_nData1);   
		break;
	case 2:
		if(5 == m_nData2)
		{   
			KillTimer(2);   
			break;   
		}   
		SetDlgItemInt(IDC_EDIT2, ++m_nData2);   
		break;
	default:
		break;
	}
	CDialog::OnTimer(nIDEvent);
}
仍然不行,请注意看我的要求,原文黑体字部分:“我现在想更改一下代码实现这个功能:我点击ok按钮,edit control控件中内容重新从0开始刷新计时,每点击一次ok按钮都是这样。”
schlafenhamster 2017-09-12
  • 打赏
  • 举报
回复
SetTimer(1, 1000, NULL); SetTimer(2, 2000, NULL); 前 加 Sleep(1000);
lonelyhacker 2017-09-12
  • 打赏
  • 举报
回复

void CTestDlg::OnOK() 
{
	// TODO: Add extra validation here
	KillTimer(1);
	KillTimer(2);
	m_nData1 = 0;
	m_nData2 = 0;
	SetDlgItemInt(IDC_EDIT1, m_nData1);
	SetDlgItemInt(IDC_EDIT2, m_nData2);

	SetTimer(1, 1000, NULL);
	SetTimer(2, 2000, NULL);
//	CDialog::OnOK();
}

void CTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch (nIDEvent)
	{
	case 1:
		if(10 == m_nData1)
		{   
			KillTimer(1);   
			break;   
		}   
		SetDlgItemInt(IDC_EDIT1, ++m_nData1);   
		break;
	case 2:
		if(5 == m_nData2)
		{   
			KillTimer(2);   
			break;   
		}   
		SetDlgItemInt(IDC_EDIT2, ++m_nData2);   
		break;
	default:
		break;
	}
	CDialog::OnTimer(nIDEvent);
}
德赛法 2017-09-11
  • 打赏
  • 举报
回复
你好,删除你标出来的语句后并不能满足我的要求啊。求注意看我的要求:“我现在想更改一下代码实现这个功能:我点击ok按钮,edit control控件中内容重新从0开始刷新计时,每点击一次ok按钮都是这样。” 谢谢
homesos 2017-09-09
  • 打赏
  • 举报
回复
局部变量与类成员变量重名,在同作用域下,使用的是局部变量,没类成员变量啥事,编译的时候,要注意看警告信息,一些警告信息还是很有用的。
homesos 2017-09-09
  • 打赏
  • 举报
回复
void CExample44Dlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 int m_nData1(0);//删除 int m_nData2(0);//删除 SetDlgItemInt(IDC_EDIT1, m_nData1); SetDlgItemInt(IDC_EDIT2, m_nData2);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧