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

新手上路,请多包涵

我知道在按下 EnterEsc 键时阻止 MFC 对话框关闭的一种方法,但我想了解该过程的更多细节以及所有常见的替代方法。

提前感谢您的帮助。

原文由 Laxman Sahni 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
1 个回答

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

原文由 rodrigo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题