需求来源
对于数字类型的CEdit如果不做符过滤,会输入一些非法值异常转成数字时异常
解决方式
用PreTranslateMessage虚函数来拦截、修改或者丢弃某些消息
实例
BOOL CMyApp::PreTranslateMessage(MSG* pMsg)
{
// 假设您有两个CEdit控件,其ID分别为IDC_EDIT1和IDC_EDIT2
if (pMsg->message == WM_CHAR)
{
CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd);
UINT nID = pWnd ? pWnd->GetDlgCtrlID() : 0;
if (nID == IDC_EDIT1 || nID == IDC_EDIT2)
{
// 过滤掉非数字字符
if (!((pMsg->wParam >= '0' && pMsg->wParam <= '9') || pMsg->wParam == VK_BACK || pMsg->wParam == VK_DELETE))
{
// 如果不是数字、Backspace或Delete键,则不处理该消息
return TRUE;
}
}
}
// 对于其他情况,调用基类的PreTranslateMessage
return CWinApp::PreTranslateMessage(pMsg);
}
知识点
- CWnd::FromHandle(pMsg->hwnd) 是MFC(Microsoft Foundation Class)库中的一个调用,用于将一个窗口句柄(HWND)转换为一个对应的CWnd对象指针,允许从一个窗口句柄获取一个MFC窗口对象,从而可以利用MFC的封装特性来更简洁、更安全地操作窗口。如果CWnd::FromHandle找不到与给定句柄关联的CWnd对象,它将返回NULL。因此,在使用返回的指针之前,应该检查它是否为NULL
- CWnd::GetDlgCtrlID() 是一个成员函数,用于获取与CWnd对象关联的对话框控件ID。每个在对话框中创建的控件都会被分配一个唯一的ID,这个ID用于区分不同的控件,并允许程序通过ID来引用或操作这些控件