防止对话框程序按Enter和ESC退出的对策

原创 2004年10月05日 13:38:00
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退出。为了使Enter键无效,最简单的办法就是将CExDlg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。ESC键的原理也是如此,它是默认和OnCancel函数映射在一起的。对于ESC键,需要自己重载CDialog类的PreTranslateMessage函数,当发现是ESC键的时候,过滤掉这个消息或者是替换掉这个消息。

一下是简单的代码示例:

wink_smile.gif【方法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);

}

tongue_smile.gif【方法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_RETUEN) return TRUE; 
 else 
    return CDialog::PreTranslateMessage(pMsg);
}

MFC去掉ESC和回车键退出的方法

重载PreTranslateMessage函数: 类头文件中声明: 类.cpp文件中重载: 上例中程序即取消此功能。 参考:http://blog.csdn.net/phenixyf/articl...
  • phenixyf
  • phenixyf
  • 2014年12月01日 12:32
  • 1291

VC里基于对话框的程序屏蔽回车键和ESC自动退出程序

在VC中创建对话框程序后,主界面自动响应ESC和Enter键并退出.但是有时候我们并不需要这个功能,并且这个功能有可能给我们带来不必要的麻烦. 所以我们需要屏蔽这个功能. 实现方法:重载对话框的P...
  • qq_23992597
  • qq_23992597
  • 2016年11月06日 21:25
  • 835

防止对话框程序按Enter和ESC退出的对策

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键 时,Windows就会自动去找输入焦点落在了哪一个按钮...
  • jiht594
  • jiht594
  • 2011年05月09日 12:53
  • 368

MFC中防止Enter和ESC关闭对话框的方法

测试环境:Win7_64bit + VS2013 原因分析: 1.按Enter为什么会关闭窗口? 在对话框有焦点的情况下,按Enter会自动触发每个对话框自带的默认“确定“按钮,从而触发...
  • NeetSonic
  • NeetSonic
  • 2016年07月07日 14:49
  • 2451

【MFC-11】VS2010/MFC基于对话框程序之修改Enter/ESC按键默认响应

一、开发环境 1、VS2010; 2、C++ / MFC; 二、修改Enter/ESC按键默认响应 1、新建基于MFC对话框的工程项目; 2、重载虚函数:...
  • qingyang8513
  • qingyang8513
  • 2016年02月26日 18:55
  • 1083

MFC对话框Enter键、Esc键、关闭按钮的消息处理

在MFC对话框中,经常会碰到按Enter或Esc键,对话框会被关闭的现象。Enter键的处理流程如下: 如果对话框有按钮拥有焦点 响应该按钮的单击事件 如果按钮ID为IDOK,并且没有事件响应函数...
  • wangyao1052
  • wangyao1052
  • 2015年05月15日 22:52
  • 1960

按Enter或Esc,MFC程序退出的解决方法

在Visual Studio中,MFC程序默认焦点在确定按钮上,回车就触发这个按钮的OnOK事件,默认按回车是触发OnOK事件,看看有没有无效断点; 注释掉OnOK();或重设tab键顺序;取消O...
  • u011028345
  • u011028345
  • 2017年06月13日 14:10
  • 782

MFC对话框程序屏蔽ESC和ENTER键退出,完美解决方案

asd template class TDlgBanEscEnter : public TBase { protected: TDlgBanEscEnter() { } template ...
  • kanbang
  • kanbang
  • 2014年05月09日 11:22
  • 763

防止对话框程序按Enter和ESC退出

来自: http://www.xiaozhou.net/cooldog/blogview.asp?logID=24在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键...
  • iicup
  • iicup
  • 2006年02月08日 20:29
  • 1008

防止对话框程序按Enter和ESC退出

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为:(1)按下Enter键时,Windows就会自动去找输入焦点落在了哪一个...
  • tlty
  • tlty
  • 2006年11月21日 22:08
  • 822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防止对话框程序按Enter和ESC退出的对策
举报原因:
原因补充:

(最多只允许输入30个字)