MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?
MFC: How do you get CMFCToolBarComboBoxButton to show on a CMFCToolBar?
一些我认为很容易的事情我无法开始工作。如何让 ComboBox 显示在 CMFCToolBar
上?这是我所做的无效操作(这意味着它只显示带有圆圈的原始占位符按钮(变灰))。
1 - 我在资源编辑器的工具栏上添加了一个按钮,给它赋予了 id 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()
returns 1 说它取代了它。
我错过了什么?
需要说明的是,这是 MS 要求执行的操作,也就是上面执行的操作:
1 - 为父工具栏资源中的按钮保留虚拟资源 ID。有关如何使用 Visual Studio 中的工具栏编辑器创建按钮的详细信息,请参阅工具栏编辑器文章。
2 - 为父工具栏的所有位图中的按钮保留一个工具栏图像(按钮图标)。
3 - 在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序中,执行以下步骤:
一个。使用派生的 CMFCToolbarButton class.
构造按钮控件
b。使用 CMFCToolBar::ReplaceButton 将虚拟按钮替换为新控件。您可以在堆栈上构造按钮对象,因为 ReplaceButton 复制按钮对象并维护副本。
TIA!!
这是一个示例项目,但它不起作用。只是工具栏上的按钮,而不是组合框。甚至从 MS 示例中获取了代码示例。
答案是 MFC 缓存了工具栏,因此如果您 运行 它没有组合,一旦您替换按钮以使用组合,它仍然不会使用它。您可以通过为工具栏自定义(如果您启用了该选项)并选择 Reset All
来使其接受更改,否则,您将在 Computer\HKEY_CURRENT_USER\Software\{NameAsUsedInSetRegistryCall}\{appname}\Workspace
下找到所有缓存项,其中各种 MFCToolBar 条目。再次删除密钥和 运行 应用程序,然后就可以了。为什么他们不让它变得聪明并有一个时间戳来知道是否自动更新,不确定?
一些我认为很容易的事情我无法开始工作。如何让 ComboBox 显示在 CMFCToolBar
上?这是我所做的无效操作(这意味着它只显示带有圆圈的原始占位符按钮(变灰))。
1 - 我在资源编辑器的工具栏上添加了一个按钮,给它赋予了 id 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()
returns 1 说它取代了它。
我错过了什么?
需要说明的是,这是 MS 要求执行的操作,也就是上面执行的操作:
1 - 为父工具栏资源中的按钮保留虚拟资源 ID。有关如何使用 Visual Studio 中的工具栏编辑器创建按钮的详细信息,请参阅工具栏编辑器文章。
2 - 为父工具栏的所有位图中的按钮保留一个工具栏图像(按钮图标)。
3 - 在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序中,执行以下步骤:
一个。使用派生的 CMFCToolbarButton class.
构造按钮控件b。使用 CMFCToolBar::ReplaceButton 将虚拟按钮替换为新控件。您可以在堆栈上构造按钮对象,因为 ReplaceButton 复制按钮对象并维护副本。
TIA!!
这是一个示例项目,但它不起作用。只是工具栏上的按钮,而不是组合框。甚至从 MS 示例中获取了代码示例。
答案是 MFC 缓存了工具栏,因此如果您 运行 它没有组合,一旦您替换按钮以使用组合,它仍然不会使用它。您可以通过为工具栏自定义(如果您启用了该选项)并选择 Reset All
来使其接受更改,否则,您将在 Computer\HKEY_CURRENT_USER\Software\{NameAsUsedInSetRegistryCall}\{appname}\Workspace
下找到所有缓存项,其中各种 MFCToolBar 条目。再次删除密钥和 运行 应用程序,然后就可以了。为什么他们不让它变得聪明并有一个时间戳来知道是否自动更新,不确定?