如何防止我的基于MFC对话框的应用程序在ESC键后关闭,但允许其他控件处理它?

时间:2015-04-15 07:40:12

标签: c++ windows mfc dialog modal-dialog

我似乎无法找到一个有效的解决方案,当用户在键盘上点击ESC后,如何阻止基于对话框的MFC应用程序关闭。我一直在查找人们只是覆盖PreTranslateMessage次通知的代码,并屏蔽WM_KEYDOWN的所有VK_ESCAPE条消息,但这对我不起作用,因为此方法会阻止所有在应用程序中按ESC键。因此,例如,当用户打开下拉列表并想要使用ESC键关闭它时,它也将被阻止。或者,如果有人打开弹出菜单或日期时间/日历控件并尝试使用ESC键击等解除它,也会发生同样的情况。

所以我的问题是,如何在ESC键击后阻止仅我的对话关闭?

2 个答案:

答案 0 :(得分:6)

Esc会自动通过身份WM_COMMAND的{​​{1}}路由到您的对话框。在IDCANCEL中有一个默认的处理程序将终止你的对话框(因此在你的情况下是应用程序),如下所示:

dlgcore.cpp

要阻止这种情况发生,只需自行添加void CDialog::OnCancel() { EndDialog(IDCANCEL); } 处理程序即可。例如,在对话框标题中添加方法签名:

IDCANCEL

在对话框消息地图中,为afx_msg void OnCancelOverride(); 添加路由:

IDCANCEL

最后添加ON_COMMAND(IDCANCEL,OnCancelOverride) 实现。如果OnCancelOverride关闭但是允许退出系统菜单“关闭”选项,则此示例实现不会退出。

Esc

答案 1 :(得分:0)

  1. 您可以直接覆盖OnCancel方法并且不写任何内容。
  2. ON_WM_CLOSE()添加到消息地图中,以便您可以通过点击右上方的X按钮退出应用。
  3. 在对话框类标题中添加方法afx_msg void OnClose ()
  4. 在对话框类cpp中添加如下代码: afx_msg void CDialogXXX::OnClose () { PostQuitMessage (0) ; CDialog::OnClose () ; }