当创建mfc 对话框时,如果想关掉回车退出程序的问题,右击CxxxDlg类,点击属性,点击重写,选择OnOk函数,创建。
我们会在.h和.cpp文件发现如下代码。.cpp文件中将CDialogEx::OnOK()注释掉即可。
.h
virtual void OnOK();
.cpp
void CCheckIDCardDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
//CDialogEx::OnOK();
}
想解决按ESC退出问题,同样,我们右击CxxxDlg类,点击属性,点击重写,选择PreTranslateMessage函数,创建。
在.cpp文件下,添加如下代码。
.h
virtual BOOL PreTranslateMessage(MSG* pMsg);
.cpp
BOOL CCheckIDCardDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) return TRUE; //去掉esc退出功能
//if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) return TRUE; //去掉回车退出功能,当然在这里也会导致整个窗体的失去回车效果
else //其他正常
return CDialogEx::PreTranslateMessage(pMsg);
}
PreTranslateMessage是虚函数,是用来截获消息的。我们可以通过重载它来处理键盘和鼠标消息。调用TranslateMessage()和DispatchMessage()是由PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。例如:可以在该函数中使用(pMsg->wParam == VK_RETURN)来拦截回车键,其中wParam中存放的是键盘上字符的虚拟码。