16,472
社区成员
发帖
与我相关
我的任务
分享
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这个网站,不知道怎么@上面几位好人,在此结贴感谢他们了。
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);
}