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

原因分析:

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

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

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

 

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

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

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

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

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

 

实际操作:

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

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

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

修改内容如下:

  1. void CXXXDlg::OnClose() {  
  2.     CDialogEx::OnCancel();  
  3. }  
  4. void CXXXDlg::OnOK() {}  
  5. void CXXXDlg::OnCancel() {}  


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