【发布时间】:2010-11-03 07:02:59
【问题描述】:
如何通过按 ESC(Escape 键)停止 mfc 对话框应用程序关闭。 执行我的应用程序后,如果我按 ESC 键,则窗口将关闭。 这怎么能阻止? 我正在使用 VC++ 6.0。
【问题讨论】:
标签: visual-c++ mfc modal-dialog
如何通过按 ESC(Escape 键)停止 mfc 对话框应用程序关闭。 执行我的应用程序后,如果我按 ESC 键,则窗口将关闭。 这怎么能阻止? 我正在使用 VC++ 6.0。
【问题讨论】:
标签: visual-c++ mfc modal-dialog
您可以覆盖 OnCancel 事件,并且仅在 IDCANCEL 是焦点项目时继续使用 OnCancel 调用。
void CMyDialog::OnCancel(void)
{
if(GetDlgItem(IDCANCEL) == GetFocus())
{
CDialog::OnCancel();
return;
}
}
【讨论】:
重写 OnCancel 并且 不要 调用基类实现。
除非您知道自己在做什么,否则不要靠近 OnClose,否则可能会破坏 Alt-F4 和 X 按钮的行为。
我一直认为 PreTranslateMessage 这样的事情是使用热核武器来破解坚果,但如果它让你的船浮起来......
【讨论】:
假设我们在这里处理一个实现为 CDialog 子类的顶级窗口,该窗口可以接收两种“类型”的关闭事件:
然而,当它们被发送到对话框时,默认情况下,MFC 通过 CDialog::OnCancel 有效地路由前一类事件,这意味着重写 OnCancel 也会破坏 Alt-F4 和 X 按钮.这意味着为了区分这两者,您需要在 OnSysCommand 中处理前者的事件,同时使用 OnOK 和 OnCancel 的覆盖来处理后者。
生成的代码如下所示:
class CTopLevelDlg: public CDialog
{
afx_win void OnSysCommand(UINT id, LPARAM lparam) override
{
if (id == SC_CLOSE)
CDialog::OnCancel();
}
void OnOK() override {}
void OnCancel() override {}
};
【讨论】: