【问题标题】:How to stop mfc dialog application from closing by pressing ESC如何通过按 ESC 来阻止 mfc 对话框应用程序关闭
【发布时间】:2010-11-03 07:02:59
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    查看this 获取代码示例。

    有关 PreTranslateMessage 示例,请参阅this

    【讨论】:

    • OnClose(WM_CLOSE 的指定处理程序)未被 Esc 按键调用。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      重写 OnCancel 并且 不要 调用基类实现。

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

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

      【讨论】:

        【解决方案4】:

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

        • 应用程序关闭事件(WM_SYSCOMMAND,ID 为 SC_CLOSE)
        • 窗口关闭事件(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 {}
        };
        

        【讨论】:

          猜你喜欢
          • 2018-09-23
          • 2010-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-08
          • 1970-01-01
          • 2021-01-21
          • 2020-05-05
          相关资源
          最近更新 更多