如何将 CDialog::SetDefId 与非按钮控件一起使用?
Posted
技术标签:
【中文标题】如何将 CDialog::SetDefId 与非按钮控件一起使用?【英文标题】:How to use CDialog::SetDefId with a non button control? 【发布时间】:2015-05-11 10:40:47 【问题描述】:我遇到过 CDialog::SetDefId,虽然它非常简单明了,但它是用于“按钮”的,但我想将此功能与非按钮控件一起使用。我知道您必须按 Enter 或 Return 使对话框使用该 ID
如果我在 CDialog::OnInitDialog 中将 nID 设置为 0 并且没有设置默认按钮,则对话框将默认为 CDialog::OnOk,如果我确实设置了默认按钮,则对话框将按预期按下该按钮。
问题是我想让它适用于非按钮控件,所以如果我将 nID 设置为不是按钮的控件,即使我为 keydown 事件或设置消息处理程序,对话框也不会执行任何操作NM_RETURN,不管控件有没有焦点,如果我按下 Enter 或 Return,对话框仍然什么都不做。
如何在不使用 PreTranslateMessage 之类的东西的情况下使控件成为默认控件?以及向控件发送的消息是什么?
提前致谢
【问题讨论】:
对于非按钮控件没有“默认”之类的东西。例如,“默认”单选按钮或“默认”编辑控件应该做什么?你想达到什么目的?对我来说,这看起来像 XY problem。 我在看这个问题***.com/questions/30127282/… 并且想知道是否可以有一个默认的非按钮控件,所以任何输入都会默认传递给它。这不是我需要解决的问题,而是我正在使用它来研究 mfc 【参考方案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。以上是关于如何将 CDialog::SetDefId 与非按钮控件一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
EasyNVR非按需拉流返回的RTMP流地址无法播放如何处理?
如何将 std::variant 与非平凡的用户对象(稍后构建)一起使用,并让访问者使用自动 lambda?