MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

问题描述

一般情况下编写的MFC对话框程序在运行的时候,如果不注意按下了ENTER 或者Esc 键,程序窗口就会默认退出。

问题原因

之所以会这样,是因为按下 Enter 键时,Windows 就会自动去找输入焦点落在了哪一个按钮上,但获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。 如果对话框没有默认按钮,那么即使对话框中没有OK 按钮,OnOK 函数也会自动被调用,对于一个普通的对话框程序来说,OnOK 函数的调用, 以为着程序会立刻退出。

为了使Enter 键/Enter 键无效,可将CExDlg 的OnOK 函数写成空函数, 然后针对OK 按钮写一个新的函数来响应。Esc 键的原理也类似,它是默认和OnCancel 函数映射在一 起的。对于 ESC 键/Enter 键,也可重载 CDialog 类的PreTranslateMessage 函数,当发现是 ESC 键/Enter 键的时 候,过滤掉这个消息或者是替换掉这个消息。

解决办法

方法一:在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg) 
{
	//屏蔽ESC键按下
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
	{
		return TRUE;
	}

	//屏蔽Enter键按下
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN && pMsg->wParam)
	{
		return TRUE;
	}

	//操作其他msg
	return CDialog::PreTranslateMessage(pMsg);
}

方法二:重载OnOK函数

  void   CxxxDlg::OnOK() 
        { 
                //   TODO:   Add   extra   validation   here 
                return;
        } 

  void   CxxxDlg::OnClickedOk() 
  { 
          //   TODO:   Add   your   control   notification   handler   code   here 
          CDialog::OnOK(); 
  } 

方法三:将所有按钮类型设为普通按钮,并设置其中一个按钮为默认按钮

在这里插入图片描述
这样下次按Enter 键就默认执行默认按钮的功能(比如刷新)。
注意:尽量让所有按钮类型设为普通按钮(按钮ID 为IDC_BUTTON* 这种),否则如果存在按钮ID为IDC_CANCEL*(常用取消类型按钮)等其他类型按钮,则按Enter 键程序窗口还是会关闭!只需将关闭等按钮类型也变为IDC_BUTTON*的普通按钮类型即可(也可直接复制一个普通按钮去代替做取消功能,替换原取消按钮)。

相关推荐

  1. 修改 Docker 镜像默认存储位置方法

    2024-06-06 14:04:33       12 阅读
  2. vue监听键盘回车事件方法

    2024-06-06 14:04:33       14 阅读
  3. vue监听键盘回车事件方法

    2024-06-06 14:04:33       16 阅读
  4. vue监听键盘回车事件方法

    2024-06-06 14:04:33       12 阅读
  5. vue监听键盘回车事件方法

    2024-06-06 14:04:33       22 阅读
  6. vue监听键盘回车事件方法..

    2024-06-06 14:04:33       16 阅读
  7. ES6 export暴露引用方式

    2024-06-06 14:04:33       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 14:04:33       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 14:04:33       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 14:04:33       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 14:04:33       20 阅读

热门阅读

  1. 如何使用 Selenium 和 Beautiful Soup 抓取动态内容

    2024-06-06 14:04:33       11 阅读
  2. Eclipse语言编程:深入探索与实用技巧

    2024-06-06 14:04:33       11 阅读
  3. sql 调优

    2024-06-06 14:04:33       9 阅读
  4. SQL入门教程

    2024-06-06 14:04:33       9 阅读
  5. 数据分析------统计学知识点(三)

    2024-06-06 14:04:33       7 阅读
  6. 前端预览pdf文件(后端返回pdf文件流)

    2024-06-06 14:04:33       8 阅读
  7. react高阶组件——withRouter

    2024-06-06 14:04:33       10 阅读
  8. vue中SKU实现

    2024-06-06 14:04:33       7 阅读
  9. 2024前端面试准备-HTML&CSS

    2024-06-06 14:04:33       10 阅读
  10. 深度学习中训练集、验证集和测试集的不同作用

    2024-06-06 14:04:33       9 阅读
  11. Linux学习—Linux服务和守护进程

    2024-06-06 14:04:33       8 阅读
  12. Overall timing accuracy 和Edge placement accuracy 理解

    2024-06-06 14:04:33       8 阅读