【问题标题】:How to use CDialog::SetDefId with a non button control?如何将 CDialog::SetDefId 与非按钮控件一起使用?
【发布时间】:2015-05-11 10:40:47
【问题描述】:


我遇到过 CDialog::SetDefId,虽然它非常简单明了,但它是用于“按钮”的,但我想将此功能与非按钮控件一起使用。我知道您必须按 Enter Return 使对话框使用该 ID

如果我在 CDialog::OnInitDialog 中将 nID 设置为 0 并且没有设置默认按钮,则对话框将默认为 CDialog::OnOk,如果我确实设置了默认按钮,则对话框将按预期按下该按钮。

问题是我想让它适用于非按钮控件,所以如果我将 nID 设置为不是按钮的控件,即使我为 keydown 事件或设置消息处理程序,对话框也不会执行任何操作NM_RETURN,不管控件有没有焦点,如果我按下 EnterReturn,对话框仍然什么都不做。

如何在不使用 PreTranslateMessage 之类的东西的情况下使控件成为默认控件?以及向控件发送的消息是什么?

提前致谢

【问题讨论】:

  • 对于非按钮控件没有“默认”之类的东西。例如,“默认”单选按钮或“默认”编辑控件应该做什么?你想达到什么目的?对我来说,这看起来像 XY problem
  • 我在看这个问题stackoverflow.com/questions/30127282/… 并且想知道是否可以有一个默认的非按钮控件,所以任何输入都会默认传递给它。这不是我需要解决的问题,而是我正在使用它来研究 mfc

标签: c++ mfc dialog


【解决方案1】:

是的,它只适用于按钮,但您可以使用 SetFocus 将焦点更改为任何其他控件:

BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    GetDlgItem(IDC_CHECK1)->SetFocus();
    return 0;  // return TRUE  unless you set the focus to a control
}

在此示例中,确定按钮可能仍是默认按钮。 Enter 键将转到默认按钮,可能是 IDOK。但是空格键会改变复选框IDC_CHECK1

必须有一个默认按钮。如果你不想要一个,那么添加一个假按钮,比如说IDC_BUTTON1,并将其设置为默认按钮并且不可见,那么你就看不到默认按钮(你仍然可以将IDC_BUTTON1 添加到消息映射并决定如何使用 Enter 键)

【讨论】:

  • 非常感谢您的回答。使用 setFocus 并按 enter 对话框仍将关闭,使用“其他按钮”不会使控件成为我想要的默认控件,也许这在当前 MFC 中是不可能的
  • @Robson:无论是当前版本还是未来版本的 MFC 都不会启用您正在寻找的东西。此限制内置于对话管理器中。这也是一件好事,因为它可以防止像您这样的人滥用某些功能。你应该处理WM_GETDLGCODE。有关更多信息,请参阅How To Use the WM_GETDLGCODE Message
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2020-08-23
  • 2012-12-25
  • 2015-06-17
相关资源
最近更新 更多