如何防止在Enter和Escape键上关闭MFC对话框?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何防止在Enter和Escape键上关闭MFC对话框?相关的知识,希望对你有一定的参考价值。

我知道一种方法可以在按下Enter或Esc键时阻止MFC对话框关闭,但我想知道该过程的更多细节以及执行此操作的所有常用替代方法。

在此先感谢您的帮助。

答案

还有一个替代上一个答案,如果您希望仍然有一个确定/关闭按钮,这个选项很有用。如果覆盖PreTranslateMessage函数,则可以像下面这样使用VK_ESCAPE / VK_RETURN:

BOOL MyCtrl::PreTranslateMessage(MSG* pMsg)
{
    if( pMsg->message == WM_KEYDOWN )
    {
        if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
        {
            return TRUE;                // Do not process further
        }
    }

    return CWnd::PreTranslateMessage(pMsg);
}
另一答案

当用户在对话框中按Enter键时,可能会发生两件事:

  1. 该对话框具有默认控件(请参阅CDialog::SetDefID())。然后将具有此控件ID的WM_COMMAND发送到对话框。
  2. 该对话框没有默认控件。然后将ID = IDOK的WM_COMMAND发送到对话框。

使用第一个选项,可能会发生默认控件的ID等于IDOK。然后结果将与第二个选项中的结果相同。

默认情况下,类CDialog有一个WM_COMMAND(IDOK)的处理程序,它将调用CDialog::OnOk(),这是一个虚函数,默认情况下它会调用关闭对话框的EndDialog(IDOK)

因此,如果要避免关闭对话框,请执行以下操作之一。

  1. 将默认控件设置为IDOK以外的控件。
  2. 将处理程序设置为不调用WM_COMMAND(IDOK)EndDialog()
  3. 覆盖CDialog::OnOk()并且不调用基本实现。

关于IDCANCEL,它是相似的,但没有相同的SetDefID(),ESC键是硬编码的。因此,要避免关闭对话框:

  1. 将处理程序设置为不调用WM_COMMAND(IDCANCEL)EndDialog()
  2. 覆盖CDialog::OnCancel()并且不调用基本实现。
另一答案

我只是覆盖OnOk事件,而不是将消息传递给父对话框,什么都不做。 所以这样做基本上很简单:

void OnOk() override { /*CDialog::OnOK();*/ }

按下return / enter键时,这可以防止对话框关闭。

以上是关于如何防止在Enter和Escape键上关闭MFC对话框?的主要内容,如果未能解决你的问题,请参考以下文章

防止 Escape 键关闭带有关闭框的 NSPanel

在无模式对话框中阻止 ESC 和 Enter 键(Win32,非 MFC)

为啥 AutoSuggestion 列表不会在 MFC 中按 Enter 关闭?

使用 javascript 在 Enter 键上提交表单

在 Enter 键上提交登录信息 [重复]

键盘 Enter 键在 MFC 对话框中不起作用?