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

问题描述 投票:17回答:3

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

在此先感谢您的帮助。

c++ mfc
3个回答
31
投票

还有一个替代上一个答案,如果您希望仍然有一个确定/关闭按钮,这个选项很有用。如果覆盖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);
}

30
投票

当用户在对话框中按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()并且不调用基本实现。

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.