重载PreTranslateMessage()函数,在此函数里捕捉ESC和ENTER键按下时的消息。
1.完全屏蔽ESC键与ENTER回车键
BOOL CLXTDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN) //回车
return TRUE;
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_ESCAPE) //ESC
return TRUE;
return CDialogEx::PreTranslateMessage(pMsg);
}
由于是完全屏蔽了,所以按钮上按ENTER键也是没有反应的。
回车键ENTER处理的是CDilog::OnOk()函数,因此,重载以下函数,并在PreTranslateMessage()函数中只屏蔽ESC就可以在按钮上使用ENTER键了。
void CLXTDlg::OnOK()
{
// TODO: Add extra validation here
//CDialogEx::OnOK(); //注意此句注释掉
}
2.完全屏蔽ESC键,捕捉ENTER回车键
BOOL CLXTDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN )
{
if(GetFocus()->GetDlgCtrlID()==IDC_LXT)//按下回车,如果当前焦点是在自己期望的控件上
{
CLxtDlg::OnBnClickedBtnSend();//添加自己的处理代码
}
return TRUE;
}
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
return TRUE;
return CDialogEx::PreTranslateMessage(pMsg);
}

本文介绍如何在VS2010的MFC对话框中通过重载PreTranslateMessage函数来屏蔽ESC和ENTER键的功能。文中提供了两种方案:一是完全屏蔽这两个按键;二是仅屏蔽ESC键,而对ENTER键进行特定处理。
2014

被折叠的 条评论
为什么被折叠?



