如何防止在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键时,可能会发生两件事:
- 该对话框具有默认控件(请参阅
CDialog::SetDefID()
)。然后将具有此控件ID的WM_COMMAND发送到对话框。 - 该对话框没有默认控件。然后将ID = IDOK的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键时,这可以防止对话框关闭。
以上是关于如何防止在Enter和Escape键上关闭MFC对话框?的主要内容,如果未能解决你的问题,请参考以下文章
在无模式对话框中阻止 ESC 和 Enter 键(Win32,非 MFC)