MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?

Posted

技术标签:

【中文标题】MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?【英文标题】:MFC: How do you get CMFCToolBarComboBoxButton to show on a CMFCToolBar? 【发布时间】:2020-06-11 22:59:17 【问题描述】:

我认为很容易的事情我无法开始工作。如何让 ComboBox 在CMFCToolBar 上显示?这是我所做的不起作用(这意味着它只显示带有圆圈的原始占位符按钮(灰色))。

1 - 我在资源编辑器的工具栏上添加了一个按钮,并为其赋予了 ID_EDIT_FIND_COMBO(我还在其中放置了一个圆圈,只是为了知道它正在使用中)。

2- 在CMainFrame 中,我将ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnToolbarReset) 添加到消息映射和下面的OnToolbarReset() 函数:

afx_msg LRESULT CMainFrame::OnToolbarReset(WPARAM wparm, LPARAM )

   UINT uitoolbarid = (UINT) wparm;
   if (uitoolbarid == IDR_MAINFRAME) 
     CMFCToolBarComboBoxButton btncombo(ID_EDIT_FIND_COMBO, GetCmdMgr()->GetCmdImage(ID_EDIT_FIND));
     m_wndToolBar.ReplaceButton(ID_EDIT_FIND_COMBO, btncombo);
   

   return 0;

ReplaceButton() 返回 1 表示已替换它。

我错过了什么?

为了清楚起见,这是 MS 所说的,即上面所做的:

1 - 为父工具栏资源中的按钮保留一个虚拟资源 ID。有关如何使用 Visual Studio 中的工具栏编辑器创建按钮的详细信息,请参阅工具栏编辑器一文。

2 - 为父工具栏的所有位图中的按钮保留工具栏图像(按钮图标)。

3 - 在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序中,执行以下步骤:

一个。使用 CMFCToolbarButton 派生类构造按钮控件。

b.使用 CMFCToolBar::ReplaceButton 将虚拟按钮替换为新控件。您可以在堆栈上构造按钮对象,因为 ReplaceButton 复制按钮对象并维护副本。

TIA!!

这是一个不起作用的示例项目。只是工具栏上的按钮,而不是组合框。甚至从 MS 示例中获取代码示例。

Sample Project

【问题讨论】:

不妨看看下面的教程:Walkthrough: Putting Controls On Toolbars. 我做了,示例没有做任何事情,只是让按钮打开一个查找对话框。我试图在工具栏上有组合框,但它不起作用。旧按钮在那里。以上是它说要做的,但不起作用。 已更新以显示 MS 指令是我正在做但不起作用的操作。 添加了不起作用的示例项目。 【参考方案1】:

答案是 MFC 缓存工具栏,因此如果您在没有组合的情况下运行它,一旦您替换按钮以使用组合,它仍然不会使用它。您可以通过自定义工具栏(如果您启用了该选项)并选择Reset All 来使其接受更改,否则,您将在Computer\HKEY_CURRENT_USER\Software\NameAsUsedInSetRegistryCall\appname\Workspace 下找到所有缓存项,其中各种 MFCToolBar条目。删除密钥并再次运行应用程序,然后它就可以工作了。为什么他们不让它变得聪明并且有一个时间戳来知道是否自动更新,不确定?

【讨论】:

以上是关于MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?的主要内容,如果未能解决你的问题,请参考以下文章

mfc如何让对话框具备win7风格

如何在MFC中让一个按钮实现打开文件(弹出选择文件窗口)的功能?

MFC如何让鼠标移动到按钮上马上改变鼠标形状为手型

让 Cairo 图形与 MFC 一起工作的小例子?

在MFC界面设计中,如何让若干个控件成为一体,或成为一个组框的一部分,编辑时可以整体移动

MFC中如何让一个控件装载几个控件