当前位置: 首页 > news >正文

【47】MFC入门到精通——MFC编辑框 按回车键 程序闪退问题 ,关闭 ESC程序退出 问题

文章目录

  • 1 按回车键 程序闪退问题
    • 1.1 问题描述
    • 1.2 原因分析
    • 1.3 解决办法
      • 1.3.1 方法一:OnOK函数写成空函数
      • 1.3.2 方法二: 直接返回
  • 2 关闭 ESC键程序退出 问题
    • 2.1 [方法1]
    • 2.2 [方法2]

1 按回车键 程序闪退问题

1.1 问题描述

在输入框输入完毕后一般习惯 回车键,

但MFC程序运行后,在编辑框输入回车,运行窗口立即退出。

在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者 ESC键,程序就会立刻退出,

1.2 原因分析

产生这样的原因,有以下几种情况:

  • ①按下Enter 键时,Windows 就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。

  • ②如果所有按钮都没有获得输入焦点,windows 就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。

  • ③如果对话框没有默认按钮,那么即使对话框中没有 OK 按钮,OnOK 函数也会动被调用,

对于一个普通的对话框程序来说,OnOK 函数的调用,以为着程序会立刻退出。

1.3 解决办法

1.3.1 方法一:OnOK函数写成空函数

为了使Enter 键无效,最简单的办法就是将 CExDIg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。

(事实上针对OK按钮,我没有写一个新的函数,但系统自带的 确认/取消 按钮仍然可用)

在…Dlg.h文件中申明

void OnOK();

在…Dlg.cpp文件中写一个空的OnOK()函数

void CSerialPortDlg::OnOK()
{//MFC的Enter键默认调用OnOK 函数,//用户在运行的时候,如果不注意按下了ENTER或者 ESC键,程序就会立刻退出,//为了使Enter 键无效,最简单的办法就是将的OnOK函数写成空函数//此时,系统自带的 确认/取消 按钮仍然可用
}

在这里插入图片描述

在这里插入图片描述
到此解决了

1.3.2 方法二: 直接返回

自己的操作完成之后一定要直接返回,不要把回车消息继续交给MFC函数处理!!!

BOOL CSSmallClassDlg::PreTranslateMessage(MSG* pMsg)
{// TODO: 在此添加专用代码和/或调用基类if (pMsg->message == WM_KEYDOWN){//是回车消息  并且 是你的编辑框上的 回车消息if (pMsg->wParam == VK_RETURN && pMsg->hwnd == m_SendDataEdit.m_hWnd){//中间 你自己 的 响应操作//自己添加的 代码 完成后 就直接返回 不要把消息继续交给下边的函数(系统处理)return TRUE;}}return __super::PreTranslateMessage(pMsg);
}

2 关闭 ESC键程序退出 问题

ESC键的原理也是如此,它是默认和 OnCancel函数映射在一起的。对于 ESC 键,需要自己重载 CDialog 类的 PreTranslateMessage 函数,当发现是 ESC 键的时候,过滤掉这个消息或者是替换掉这个消息。

以下是简单的代码示例

2.1 [方法1]

可以先重载OnOK函数

void CTestDlg::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.2 [方法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;elsereturn CDialog::PreTranslateMessage(pMsg);
}
http://www.dtcms.com/a/284992.html

相关文章:

  • git merge 和 git rebase 的区别
  • LoRA:大模型低秩适配技术全景——原理、演进与高效微调革命
  • MongoDB社区版安装(windows)
  • 第4.3节 iOS App生成追溯关系
  • 联发科MT6897 5G智能手机应用处理器 软件寄存器表:通用闪存(UFS)
  • Kafka——无消息丢失配置怎么实现?
  • C++:list
  • 博客摘录「 Springboot入门到精通(超详细文档)」2025年7月4日
  • ubuntu 22.02 带外进单用户拯救系统
  • 人工智能之数学基础:概率论和数理统计在机器学习的地位
  • 什么是 M4A 和 WAV?这两种音频互转会导致音质发生变化吗
  • python爬虫入门(小白五分钟从入门到精通)
  • 振石股份闯关上市:业绩连降,资产、负债两端暗藏隐忧
  • leetcode 3202. 找出有效子序列的最大长度 II 中等
  • 18650锂电池点焊机:新能源制造的精密纽带
  • Unreal5从入门到精通之如何实现第一人称和第三人称自由切换
  • 电脑重启后快速找回历史复制内容的实操方法
  • YOLOv8 PTQ、QAT量化及其DepGraph剪枝等压缩与加速推理有效实现(含代码)
  • Leetcode 494. 目标和
  • 力扣 hot100 Day47
  • #systemverilog# 关键字之 protected 用法
  • Python在字符串中查找所有匹配字符索引的多种方法 | Python字符串操作教程
  • h264编码总结
  • C语言(20250717)
  • select_shape_proto 用起来很省事
  • 4G模块 A7680通过MQTT协议连接到华为云
  • 广州VR 内容制作报价:各类 VR 内容的报价详情​
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十课——图像还原的FPGA实现
  • 深入理解进程等待:wait的简化与waitpid的灵活性
  • kimi故事提示词 + deepseekR1 文生图提示