如何通过按ESC停止关闭mfc对话框应用程序

时间:2009-06-16 10:23:41

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

如何通过按ESC(退出键)停止mfc对话框应用程序关闭。 如果我按ESC键执行我的应用程序后,窗口关闭。 怎么能停止? 我使用的是VC ++ 6.0。

4 个答案:

答案 0 :(得分:4)

如果IDCANCEL是焦点项目,您可以覆盖OnCancel事件并仅使用OnCancel调用继续前进。

void CMyDialog::OnCancel(void)
{
   if(GetDlgItem(IDCANCEL) ==  GetFocus())
    {  
        CDialog::OnCancel();
        return;
    }
}

答案 1 :(得分:2)

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

  1. 使用取消通知
  2. 创建一个OnCancel处理程序并执行任何操作
  3. 您可以处理OnClose事件并执行任何操作。
  4. 您可以覆盖PreTranslateMessage并在那里检查Esc键并执行任何操作。
  5. 检查this代码示例。

    有关PreTranslateMessage示例,请参阅this

答案 2 :(得分:1)

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

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

我一直认为PreTranslateMessage就像使用热核武器来破解坚果一样,但如果它漂浮在你的船上......

答案 3 :(得分: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 {}
};