我知道一种方法可以在按下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键时,可能会发生两件事:
CDialog::SetDefID()
)。然后将具有此控件ID的WM_COMMAND发送到对话框。使用第一个选项,可能会发生默认控件的ID等于IDOK。然后结果将与第二个选项中的结果相同。
默认情况下,类CDialog
有一个WM_COMMAND(IDOK)
的处理程序,它将调用CDialog::OnOk()
,这是一个虚函数,默认情况下它会调用关闭对话框的EndDialog(IDOK)
。
因此,如果要避免关闭对话框,请执行以下操作之一。
IDOK
以外的控件。WM_COMMAND(IDOK)
的EndDialog()
。CDialog::OnOk()
并且不调用基本实现。关于IDCANCEL,它是相似的,但没有相同的SetDefID()
,ESC键是硬编码的。因此,要避免关闭对话框:
WM_COMMAND(IDCANCEL)
的EndDialog()
。CDialog::OnCancel()
并且不调用基本实现。我只是覆盖OnOk事件,而不是将消息传递给父对话框,什么都不做。 所以这样做基本上很简单:
void OnOk() override { /*CDialog::OnOK();*/ }
按下return / enter键时,这可以防止对话框关闭。