3

如何通过按 ESC(Escape 键)来停止关闭 mfc 对话框应用程序。执行我的应用程序后,如果我按 ESC 键,则窗口将关闭。这怎么能阻止?我正在使用 VC++ 6.0。

4

4 回答 4

4

您可以覆盖 OnCancel 事件,并且仅在 IDCANCEL 是焦点项时继续使用 OnCancel 调用。

void CMyDialog::OnCancel(void)
{
   if(GetDlgItem(IDCANCEL) ==  GetFocus())
    {  
        CDialog::OnCancel();
        return;
    }
}
于 2009-06-16T10:35:57.223 回答
2

有不同的方法可以做到这一点。你可以:

  1. 创建一个 OnCancel 处理程序并使用 Cancel 通知做任何你想做的事情
  2. 您可以处理 OnClose 事件并做任何您想做的事情。
  3. 您可以覆盖 PreTranslateMessage 并在那里检查 Esc 键并做任何您想做的事情。

检查代码示例。

对于 PreTranslateMessage 示例,请参阅

于 2009-06-16T10:35:45.867 回答
1

覆盖 OnCancel 并且调用基类实现。

除非您知道自己在做什么,否则不要靠近 OnClose,否则可能会破坏 Alt-F4 和 X 按钮的行为。

我一直认为 PreTranslateMessage 这样的事情是使用热核武器来破解坚果,但如果它漂浮你的船......

于 2009-06-16T21:38:47.167 回答
0

假设我们在这里处理一个作为 CDialog 子类实现的顶级窗口,该窗口可以接收两种“类型”的关闭事件:

  • 应用程序关闭事件(ID 为 SC_CLOSE 的 WM_SYSCOMMAND)
  • 窗口关闭事件(ID 为 IDOK 或 IDCANCEL 的 WM_COMMAND)

然而,当前一类事件被发送到对话框时,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 {}
};
于 2019-06-21T15:56:46.283 回答