在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER 或者Esc 键,程序就 会立刻退出,之所以会这样,是因为按下 Enter 键时,Windows 就会自动去找输入焦点落在了哪一个按 钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows 就会 自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话 框中没有OK 按钮,OnOK 函数也会自动被调用,对于一个普通的对话框程序来说,OnOK 函数的调用, 以为着程序会立刻退出。为了使Enter 键无效,最简单的办法就是将CExDlg 的OnOK 函数写成空函数, 然后针对OK 按钮写一个新的函数来响应。Esc 键的原理也是如此,它是默认和OnCancel 函数映射在一 起的。对于 ESC 键,需要自己重载 CDialog 类的PreTranslateMessage 函数,当发现是 ESC 键的时 候,过滤掉这个消息或者是替换掉这个消息。
以下是简单的代码示例:
【方法1】 可以先重载OnOK函数
voidCTestDlg::OnOK()
{ //里面什么也不写}
然后重载PreTranslateMessage 函数 把Esc 键的消息,用RETURN 键的消息替换,这样,按Esc 的时候,也会执行刚才的OnOK 函数, 这样问题就可以解决了。
BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
{
pMsg->wParam=VK_RETURN; //将ESC 键的消息替换为回车键的消息,这样,按Esc 的时候
//也会去调用OnOK函数,而OnOK 什么也不做,这样Esc 也被屏蔽
}
return CDialog::PreTranslateMessage(pMsg);
}
【方法2】 直接在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息,和以上方法大同小异:
BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
return TRUE;
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
return TRUE;
else
return CDialog::PreTranslateMessage(pMsg);
}