MFC对话框程序中有一个CStatic控件,ID是IDC_TXTET,用于运行时显示已使用时间,需要每秒刷新一次。
CStatic控件已关联到成员变量CStatic m_txtET和CString m_strET;
刷新显示的代码如下,其中m_h,m_m,m_s分别是经过的小时、分钟和秒,当然,(1)和(2)只是两仲实现方法不是同时使用的:
m_strRT.Format(L"%.02d:%.02d:%.02d",m_h,m_m,m_s);
//(1)
SetDlgItemText(IDC_TXTET,m_strRT);
//(2)
m_txtET.SetWindowText(m_strRT);
OutputDebugString(m_strRT); //调试状态下,输出到Output窗口试过用多媒体定时器timeSetEvent和单独创建一个线程作定时器,不论是在timeSetEvent的回调函数还是线程的处理函数中调用上述代码(线程处理函数中是把m_txtET指针传进去的),都可以在Output窗口中看到正确的输出,但m_txtET控件就是不刷新,要等到用timeKillEvent终止定时器或者退出定时线程后,该控件的内容才会变成“00:00:01”,此时Output窗口显示的内容却是“00:12:17”。请问是什么原因?如何解决?
CStatic控件已关联到成员变量CStatic m_txtET和CString m_strET;
刷新显示的代码如下,其中m_h,m_m,m_s分别是经过的小时、分钟和秒,当然,(1)和(2)只是两仲实现方法不是同时使用的:
m_strRT.Format(L"%.02d:%.02d:%.02d",m_h,m_m,m_s);
//(1)
SetDlgItemText(IDC_TXTET,m_strRT);
//(2)
m_txtET.SetWindowText(m_strRT);
OutputDebugString(m_strRT); //调试状态下,输出到Output窗口试过用多媒体定时器timeSetEvent和单独创建一个线程作定时器,不论是在timeSetEvent的回调函数还是线程的处理函数中调用上述代码(线程处理函数中是把m_txtET指针传进去的),都可以在Output窗口中看到正确的输出,但m_txtET控件就是不刷新,要等到用timeKillEvent终止定时器或者退出定时线程后,该控件的内容才会变成“00:00:01”,此时Output窗口显示的内容却是“00:12:17”。请问是什么原因?如何解决?
目前的代码是这样的:
在计时开始处调用:TimerCtrl(TRUE);
在计时结束处调用:TimerCtrl(FALSE);
virtual void OnMMTimer();//声明要回调的成员方法
void TimerCtrl(const bool bEn);
//作为回调函数的静态方法
static void CALLBACK TimerCallBack(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CPQQDlg * pThis=(CPQQDlg *)dwUser;//由this指针获得实例的指针 pThis->OnMMTimer();//调用要回调的成员方法
}void CPQQDlg::TimerCtrl(const bool bEn)
{
if (bEn)
{
m_h = m_m = m_s = 0;
mmTimer = timeSetEvent(1000,1,&TimerCallBack,(DWORD)this,TIME_PERIODIC
}
else
timeKillEvent(mmTimer);
}void CPQQDlg::OnMMTimer()
{
m_s ++;
if (60 == m_s)
{
m_s = 0;
m_m++;
if (60 == m_m)
{
m_m = 0;
m_h++;
}
}
m_strET.Format(L"%.02d:%.02d:%.02d",m_h,m_m,m_s);
SetDlgItemText(IDC_TXTET,m_strET);
OutputDebugString(m_strET);
// m_txtET.SetWindowText(m_strET);
}