当我如入的数字超出edit控件变量的范围时,就会弹出越界错误对话框。这不是问题。
问题是,在我没有关闭越界对话框的情况下,执行OnTimer()的“UpdateData(FALSE);”时,就出现调试中断错误。
PS:点击“确定”关闭越界对话框后没有出现调试中断错误,只是在调试窗口提示“Warning: initial dialog data is out of range.”
代码不长,希望有老鸟指导一下。谢了!我只有20积分而已,全贡献出来了。########################################################################
控件属性ID       控件变量            范围
IDC_EDIT1        int m_num           1~10
IDC_Time         CString m_strTime
BOOL CTestDlg::OnInitDialog()   //对话框初始化
{
         …………
SetTimer(ID_CLOCK,10000,NULL); //设置每10秒执行一次OnTimer
m_num = 1;
CTime CurTime = CTime::GetCurrentTime();
m_strTime.Format(_T("%d:%d:%d"),CurTime.GetHour(),CurTime.GetMinute(),CurTime.GetSecond());
         UpdateDate(FALSE);
         return true;
}
void CTestDlg::OnEnChangeEdit1()  //Edit1的数值更改时
{
UpdateData(TRUE);
TRACE("%d\n",m_num);
UpdateData(FALSE);
}
void CTestDlg::OnTimer(UINT_PTR nIDEvent)
{
CTime CurTime = CTime::GetCurrentTime();
m_strTime.Format(_T("%d:%d:%d"),CurTime.GetHour(),CurTime.GetMinute(),CurTime.GetSecond());
UpdateData(FALSE);
CDialogEx::OnTimer(nIDEvent);
}
###################################################################

解决方案 »

  1.   

    看 XXXXDlg::DoDataExchange(CDataExchange* pDX) 内 DDV_MinMaxXXXX 它限制了范围
      

  2.   

    void CTesttimerDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default

    if( this->IsWindowEnabled() )
    {
    CTime CurTime = CTime::GetCurrentTime();
    m_strTime.Format(_T("%d:%d:%d"),CurTime.GetHour(),CurTime.GetMinute(),CurTime.GetSecond());
    UpdateData(FALSE);
    }
    CDialog::OnTimer(nIDEvent);
    }
      

  3.   

    ###########################################################
    void CTestDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_num);
    DDV_MinMaxInt(pDX, m_num, 1, 10);
    DDX_Text(pDX, IDC_Time, m_strTime);
    }
      

  4.   


    这样确实可以!先谢了。不过如果我想主窗口不是在Enabled状态下,时间依然在计时不知道可不可以。
      

  5.   


    也可以先创建一个线程 ::CreateThread( NULL, 0, mytimer, this, 0, NULL );

    static DWORD __stdcall mytimer( LPVOID param );DWORD
    CTesttimerDlg::mytimer( LPVOID param )
    {
    CTesttimerDlg * pthis = ( CTesttimerDlg * )param;
    do
    {
    Sleep( 1000 );
    CStatic *t;
    t = ( CStatic * )( pthis->GetDlgItem( IDC_STATIC111 ) );
    //::SendMessage( hwnd, WM_MYTIMER, 0, 0 );
    CTime CurTime = CTime::GetCurrentTime();
    CString a;
    a.Format(_T("%d:%d:%d"),CurTime.GetHour(),CurTime.GetMinute(),CurTime.GetSecond());
    t->SetWindowText( a );
    } while( 1 ); return 0;
    }
    这样也可以,就是不太符合  在线程中不要操作界面的  规则。