码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法


    文章目录

      • 问题描述
      • 问题原因
      • 解决办法
        • 方法一:在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息
        • 方法二:重载OnOK函数
        • 方法三:将所有按钮类型设为普通按钮,并设置其中一个按钮为默认按钮

    问题描述

    一般情况下编写的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*的普通按钮类型即可(也可直接复制一个普通按钮去代替做取消功能,替换原取消按钮)。

  • 相关阅读:
    使用docker搭建overleaf环境
    [AIGC] 深度优先搜索(DFS)详解及其在LeetCode问题中的应用
    定时轮询-长轮询-websocket
    产业互联网周报:滴滴被处以80亿元巨额罚款;消息称中国正启动欧洲企业到中国上市计划;字节跳动确认自研专用芯片...
    ThreadLocal类与synchronize关键字区别----一个简单示例
    声纹技术(一):声纹技术的前世今生
    第17章 其他数据库日志【4.日志与备份篇】【MySQL高级】
    django中事务和锁
    ipad触控笔是哪几款?性价比触控笔排行榜
    Linux文件权限解析:从入门到实践
  • 原文地址:https://blog.csdn.net/m0_48170265/article/details/139305773
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号