我想在数据验证时禁止MFC错误消息:
void CMotorView::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX, IDC_AMBIENTTEMP, m_pSet->m_AmbientTemp);
}
如果editcontrol IDC_AMBIENTTEMP
中的文本在将数据保存到变量时不是数字,则框架将显示一个消息框,提示用户输入数字。我想压制此消息,并在我自己的代码中处理错误。
我认为框架将在验证错误的情况下抛出异常,但似乎并非如此。 DDX_Text
也没有返回值我做错了什么?
void CMotorView::DoDataExchange(CDataExchange* pDX)
{
try
{
DDX_Text(pDX, IDC_AMBIENTTEMP, m_pSet->m_AmbientTemp);
}
catch(CUserException* ex)
{
// nothing caught here
}
catch(...)
{
// nothing caught here either
}
}
答案 0 :(得分:1)
如果出现错误dl
首先显示错误对话框,则会抛出异常。您可以使用DDX_Text
来捕获此信息。请注意,抛出一个指针!
我建议你把DDX_Text写成一个字符串。这不会失败,然后您可以检查字符串是否真的是一个数字。或者您可以编写自己的DDX_TextMyFn来执行您想要的操作。您可以将MFC原始函数用作基本实现。
答案 1 :(得分:1)
将ES_NUMBER设置为编辑控件的样式。这将减少用户可以犯的错误。
DDX例程中的消息框无法被抑制或重定向。
这是一些使用CEditInt类的伪代码,该类具有成员函数GetValue / SetValue。
您还可以编写一个适用于CEdit控件的DDX_EditInt例程,并使用Get / SetDlgItemInt。
void AFXAPI DDX_EditInt(CDataExchange* pDX, int nIDC, int &iValue)
{
// Get pointer to control
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
CEditInt *pWnd = (CEditInt *)CWnd::FromHandle(hWndCtrl);
// Must be an CEditInt
ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CEditInt)));
// get the information from the defined window
if (pDX->m_bSaveAndValidate)
// Get the Value
iValue = pWnd->GetValue();
else
pWnd->SetValue(iValue);
}