当我如入的数字超出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);
}
###################################################################
{
// 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);
}
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);
}
这样确实可以!先谢了。不过如果我想主窗口不是在Enabled状态下,时间依然在计时不知道可不可以。
也可以先创建一个线程 ::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;
}
这样也可以,就是不太符合 在线程中不要操作界面的 规则。