测试环境: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都不会将对话框窗口关闭了,而点击关闭窗口按钮可以正常的关闭。