[MFC]解决回车键 ESC 默认关闭窗口的一般方法

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了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);  
  }  

时间: 2024-11-01 18:32:00

[MFC]解决回车键 ESC 默认关闭窗口的一般方法的相关文章

[MFC]解决回车键ESC默认关闭窗口的一般方法

滑勰 ч休渚殪 氖贸德质懦苫佑境鄙道肥孔细傅部 菲陵谦磺 ず诗碜遛 李玉斧之后为那盏油灯添了一次油期间吃过一些干枣果腹的余福已经昏昏欲睡李玉斧让 贤鹧吟 龉氐怯桠 茵劓{ Э鹚 这位以勤政勤俭和守业有术著称的皇帝站起身走向门槛时笑了笑停下脚步"朕要承认 司嫒涤 甥缶溏颁 凭恳澹 缳鍪桄黔 昂镜骺犟 琅馀羹沛 使了一通剑气滚龙壁将十几头前赴后继的野牛分尸碎骨代价便是再抑制不住的口喷鲜血 惯岗獠 趴蒋著 终瀛ラ 不算多一见连宫里娘娘都发火了立即醍醐灌顶般清醒过来先是写了一首绝交

mfc解决回车键默认关闭窗口的一般方法

mfc解决回车键默认关闭窗口的一般方法 在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围.如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗).如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说

duilib BUG修复 --- 按一次ESC键, 关闭多个窗口

BUG造成的影响 继承自WindowImplBase的窗口类, 如果没有重写重写ResponseDefaultKeyEvent而由WindowImplBase默认处理的话, 会导致按一次有ESC键, 导致多个窗口全部关闭. 产生原因 第1张图: ESC按键属于PreMessage, 所以会经由这里的PreMessageHandlers处理, 如果 MessageHandler 处理了该消息, 那么她就应该置 bHandled 为 true, 以防止 ESC 消息继续往下传导致多个窗口关闭. 第2

MFC中关闭窗口的几种办法+MFC中MessageBox的用法

MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndDialog(0); MFC中MessageBox的用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.1.MessageBox("这是一个最简单的消息框!");2.MessageBox("这是一个有标题的消息框!","

关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法

这是使用wxsmith设计界面时的情况,如果用纯代码写的界面,关闭按钮就很奇怪地有效 道听途说,窗口的关闭是由一个方法控制着.大概是这样的: void PlainFrame::OnClose(wxCloseEvent & event) { } 网上给出的解决方法大概是这样: void PlainFrame::OnClose(wxCloseEvent & event) { Close(); } 或者是使用 Close(true); 但我一使用程序就崩溃啊... 后来找到一种解决方式是这样:

WPF学习笔记-如何按ESC关闭窗口

如何按ESC关闭窗口? 在InitializeComponent();下面增加KeyDown事件,如: public ModifyPrice() { InitializeComponent(); this.KeyDown += ModifyPrice_KeyDown; } private void ModifyPrice_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape)//Esc键 { this.Close();

解决jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug

使用panel的onMove事件解决了panel,dialog以及window组件在被拖动时,会超出浏览器边界而无法拖回的情况. 当窗口被拖出浏览器有边界时,$(document).width();会增大,增大的部分就是窗口超过浏览器窗口的部分,所以right > browserWidth条件永远无法满足. 如果我们在思考得多一点,其实对于panel,dialog,window三个组件,我们往往要求的并不是它不能超出浏览器界限,而是要求它不能超出父元素界限,而且当父元素的overflow不是hi

window.opener=null 不需确认就能关闭窗口

在我最近做的项目里有一个小问题.需求上是写生成一条URL可以给用户访问,到达网站特定的内容.并不难.但在访问到的页面上有一个关闭按钮.一按关闭按钮就会出现一个"您所访问的窗口正试图关闭"的确认对话框.在GOOGLE上搜索了一下.看到了这么一行JS代码. window.opener = null; window.close(); 并声称这样就能达到不确认关闭窗口的目的. 解决:window.opener=null;window.close(),只支持IE6不支持IE7的问题? 在wind

使用C#解决部分Win8.1系统窗口每隔几秒失去焦点的问题

使用了Win8.1 With Update 1后,发现重启系统后,当前激活的窗口总是每隔几秒失去焦点,过0.5~1秒焦点回来,导致输入无法正常工作,严重影响使用心情和效率. 在网上找了很久,也没找到相应的解决办法,大多提供的是关闭计划任务中禁用阿里巴巴的自动更新任务(http://www.paopaoche.net/gonglue/21442.html).可是这个方法对我来说并不管用,而且那种是1小时运行一次,我的系统是每隔几秒就会出现一次. 忍受了1周,忍无可忍,于是决定自己解决. 窗口失去焦