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”。请问是什么原因?如何解决?

解决方案 »

  1.   

    建议用定时器,直接在OnTimer中更新
      

  2.   

    建议用定时器,直接在OnTimer中更新,试过了,由于我有大量的SendMessage,效果不好用WM_TIMER等试试处理OnTimer,请具体说说
    目前的代码是这样的:
    在计时开始处调用: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);
    }
      

  3.   

    设置完控件数据,请记得用UpdateData(false)刷新显示
      

  4.   

    不能用UpdateData(false),会引发一个错误。SetWindowText和SetDlgItemText都不需要用UpdateData(false)刷新的
      

  5.   

    还是结了吧-没办法,改用DELPHI重写了一遍