如何将 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,不管控件有没有焦点,如果我按下 EnterReturn,对话框仍然什么都不做。

如何在不使用 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多通道非按需直播视频播放时卡顿如何处理?

EasyNVR非按需拉流返回的RTMP流地址无法播放如何处理?

如何将 std::variant 与非平凡的用户对象(稍后构建)一起使用,并让访问者使用自动 lambda?

将 Qt 信号/槽与非 Qt 线程一起使用

0013-如何在Kerberos与非Kerberos的CDH集群BDR不可用时复制数据

如何在 FMX 设计时与非存储子控件交互? (TTabControl 选项卡内容)