我正在尝试修复MFCCEdit
控件中的验证错误。当前,验证是在OnChange
事件处理程序中执行的。但这是行不通的,因为它会在用户完成输入之前验证数据。
因此,我正在尝试在OnKillFocus
事件处理程序中进行验证。如果验证失败,则GotoDlgCtrl()
可以将焦点返回到包含无效数据的编辑框。当我调用时GotoDlgCtrl()
,kill焦点事件再次触发,并且我处于无限循环中。
因此,我想处理一个事件,该事件在控件失去焦点之前就触发了,因此,如果我确定数据无效,则可以停止离开焦点,而是让用户输入正确的数据。
我知道我曾经在某个地方看到过Validating事件,但这可能是在.Net世界中。但是它提供了我正在寻找的功能。
右键单击对话框资源,然后调用“类向导”:
接下来,转到“虚拟功能”选项卡,找到PreTranslateMessage
并添加它:
然后,您可以执行以下操作:
BOOL CTestDlgDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_CHAR)
{
CWnd *pControl = GetDlgItem(IDC_EDIT1);
if (pControl->GetSafeHwnd() == pMsg->hwnd)
{
if (pMsg->wParam == _TINT('!'))
{
AfxMessageBox(_T("Not allowed ! character"));
return TRUE;
}
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
通常,控件是类型的成员变量,CEdit
因此您可以与之进行比较m_edit.GetSafeHwnd()
。
结果:
我知道您说过:
但这是行不通的,因为它会在用户完成输入之前验证数据。
您可以WM_KEYUP
改用:
BOOL CTestDlgDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYUP)
{
CWnd *pControl = GetDlgItem(IDC_EDIT1);
if (pControl->GetSafeHwnd() == pMsg->hwnd)
{
CString str;
GetDlgItemText(IDC_EDIT1, str);
if (str.Find(_T("!")) >= 0)
{
AfxMessageBox(_T("Not allowed ! character"));
return TRUE;
}
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
这将使您有机会在更新显示后进行验证。
另一种方法是自定义您的DoDataExchange
处理程序。您可以在其中根据需要进行验证。然后在您的代码中简单测试UpdataData(TRUE)
for的返回值FALSE
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句