MFC对话框程序屏蔽回车与ESC键,Tab键

2023-12-27 01:38

本文主要是介绍MFC对话框程序屏蔽回车与ESC键,Tab键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里仅介绍重载对话框的消息预处理函数PreTranslateMessage(MSG* pMsg)来进行消息屏蔽。

MFC下基于对话框的程序,默认的会有一个“确定”按钮,还有一个“取消”按钮,那个“确定”按钮是默认按钮。这时候运行程序,按下回车键或者ESC键,程序都会退出。

《Inside Visual C++》一书中:“当用户按下Enter键时,Windows就会自动去查找“输入焦点”落在了哪一个按钮上,获得焦点的按钮的四周将被点线矩形框所包围。如果所有按钮都没有获得输入焦点,Windows就会自动去寻找程序或资源所指定的默认按钮。如果对话框没有默认按钮,那么即使对话框中没有“确定”按钮,OnOK函数也会自动被调用”。有的时候肯定是不想在按下回车键之后退出对话框程序,ESC也是一样。解决方法也很简单,重载对话框的PreTranslateMessage函数,然后在该函数中干掉ESC和回车这两个按键的消息。


方法一:
在XXXDlg.h文件中的CXXXDlg类中添加:

protected: virtual BOOL PreTranslateMessage(MSG* pMsg);

在XXXDlg.cpp文件中添加实现:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{if (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_RETURN: //屏蔽回车键return TRUE;case VK_ESCAPE: //屏蔽ESC键return TRUE;case VK_TAB:{int nStart, nEnd; HWND hWnd = ::SetFocus(m_ctrlEditContent.m_hWnd);// m_ctrlEditContent为编辑框名称 if(hWnd != m_ctrlEditContent.m_hWnd){::SetFocus(hWnd);    }else        //处理编辑框中的Tab键,使得可以在其中输入制表符'\t'{    m_ctrlEditContent.GetSel(nStart,nEnd);    m_ctrlEditContent.SetSel(nStart,nEnd);    m_ctrlEditContent.ReplaceSel("\t");return TRUE;}   }        default:break;}}return CDialog::PreTranslateMessage(pMsg);
}

编辑框接受TAB为’\t’,而不是在各个空间之间转移。这就是上面case VK_TAB的作用。或许有的程序用不到这个功能,个人觉得写在这里可以加深消息预处理的理解。同时可以参考更改回车键的响应。参见:http://www.vckbase.com/index.php/wv/31.html


方法二:
另一个屏蔽回车键的方法,解释见注释。

在XXXDlg.h文件中的CXXXDlg类中添加:

// 生成的消息映射函数
...
virtual BOOL PreTranslateMessage(MSG* pMsg);//这里是上面所添加的消息预处理函数
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg LRESULT OnGetDefID(WPARAM wp, LPARAM lp);//添加消息响应函数
DECLARE_MESSAGE_MAP()

在XXXDlg.cpp文件中添加实现:

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)... ON_MESSAGE(DM_GETDEFID, OnGetDefID) 
END_MESSAGE_MAP()//屏蔽按enter键就退出的情况
//当用户按下回车键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,
//Windows再将它作为WM_COMMAND发送。所以,要重载WM_GETDEFID消息,
//在有关Windows的文档中是这样描述WM_GETDEFID返回值的:
//“如果有缺省得按钮,则返回值的高位字包含DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零。” 
LRESULT CXXXDlg::OnGetDefID(WPARAM wp, LPARAM lp) 
{ return MAKELONG(0,DC_HASDEFID); 
}

参考来源 详见

这篇关于MFC对话框程序屏蔽回车与ESC键,Tab键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541474

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线