MFC中防止Enter和ESC关闭对话框的方法

本文介绍如何在对话框中禁用ESC键和Enter键的默认关闭行为,并保持点击关闭按钮的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:Win7_64bit + VS2013


原因分析:

1.按Enter为什么会关闭窗口?

在对话框有焦点的情况下,按Enter会自动触发每个对话框自带的默认“确定“按钮,从而触发消息促使系统去调用OnOK()函数,关闭对话框窗口。

所以我们需要将OnOK()函数复写,使它什么也不做就行了。


2.按ESC为什么会关闭窗口?

在对话框有焦点的情况下,按ESC会自动触发每个对话框自带的默认“取消“按钮,从而促使系统去调用OnCancel()函数,关闭对话框窗口。

那么我们将OnCancel()函数复写,使它什么也不做就行了。

但是这样有个问题,就是现在如果我们点击右上角的关闭窗口按钮,这会触发WM_CLOSE消息,而这个消息最终也会调用OnCancel()来关闭窗口,当我们复写了OnCancel()后,会发现点关闭按钮也没法关闭窗口了。

所以我们继续复写WM_CLOSE消息响应函数OnClose(),让其直接调用父类的OnCancel()方法来关闭对话框,而不是使用我们复写的OnCancel()。


实际操作:

第一步,进入类向导,选中目标对话框对应的CXXXDlg类名。


第二步,选择“消息”选项卡,复写WM_CLOSE消息响应函数。


第三步,选择“虚函数”选项卡,复写OnCancel和OnOk两个函数。


修改内容如下:

void CXXXDlg::OnClose() {
	CDialogEx::OnCancel();
}
void CXXXDlg::OnOK() {}
void CXXXDlg::OnCancel() {}

现在在对话框得到焦点的情况下,按ESC或者Enter都不会将对话框窗口关闭了,而点击关闭窗口按钮可以正常的关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值