多CMFCToolbar的生成及解决方案

136 篇文章 ¥59.90 ¥99.00
本文介绍了在C++中使用CMFCToolbar时如何避免生成多个相同工具栏并实现多个工具栏间数据同步。通过分配不同ID防止工具栏内容重复,使用静态数据确保所有工具栏显示相同数据并利用WM_IDLEUPDATECMDUI消息更新UI。

多CMFCToolbar的生成及解决方案

在使用CMFCToolbar时,我们有时需要为不同的视图窗口生成多个不同的工具栏。但是,在生成多个工具栏时,我们会面临一些问题,例如显示多个相同的工具栏、多个工具栏数据的同步等等。下面,我将为大家介绍如何解决这些问题:

  1. 显示多个相同的工具栏

当我们用“AddToolBar()”函数添加工具栏时,函数会自动创建一个新的工具栏,但是它们可能会有相同的ID。这将导致多个工具栏在程序中显示相同的内容。

解决方案:

在创建每个工具栏时,需要分配不同的ID。可以使用“CMFCToolbar::GetUserImages()”方法获取全局唯一的ID,并将其作为新工具栏的ID。

例如:

// 创建第一个工具栏
m_wndToolBar1.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_MAINFRAME);
m_wndToolBar1.LoadBitmap(IDR_TOOLBAR_IMAGES);
m_wndToolBar1.SetWindowText(_T(“ToolBar 1”));
m_wndToolBar1.SetBarStyle(m_wndToolBar1.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC |
CBRS_HIDE_INPLACE);

// 创建第二个工具栏
m_wndToolBar2.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_MAINFRAME);<

### CMFCToolbar 的使用方法与实例 `CMFCToolbar` 是 MFC 中用于创建工具栏的一个类。它提供了丰富的功能来定制工具栏的行为和外观。以下是关于 `CMFCToolbar` 使用的一些核心概念以及代码示例。 #### 工具栏的基本初始化 为了在应用程序中使用 `CMFCToolbar`,通常需要通过重载框架窗口中的函数来进行初始化。以下是一个基本的初始化过程: ```cpp BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadImages(IDR_MAINFRAME_TOOLBAR)) { TRACE0("Failed to create toolbar\n"); return FALSE; } m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); // 调整布局并启用自定义样式 CString strCaption; m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCaption); return TRUE; } ``` 此代码片段展示了如何创建一个工具栏,并加载其图像资源[^1]。 #### 自定义按钮行为 可以通过覆盖默认的消息处理程序来自定义工具栏按钮的行为。例如,当点击某个特定按钮时执行某些逻辑: ```cpp void CMainFrame::OnUpdateMyCommand(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); // 启用命令 } void CMainFrame::OnMyCommand() { AfxMessageBox(_T("You clicked the custom button!")); } ``` 在此例子中,`OnUpdateMyCommand` 函数负责更新菜单项或工具栏按钮的状态,而 `OnMyCommand` 则实现了实际的功能调用[^1]。 #### 动态调整工具栏位置 如果希望允许用户动态调整工具栏的位置或者隐藏/显示工具栏,则可以实现如下功能: ```cpp void CMainFrame::OnViewToolbar() { static BOOL bShow = TRUE; bShow = !bShow; m_wndToolBar.ShowWindow(bShow ? SW_SHOW : SW_HIDE); } ``` 这段代码提供了一个简单的切换机制,用来控制工具栏的可见性[^1]。 #### 高级特性支持 `CMFCToolbar` 还支持许高级特性,比如下拉列表、组合框等复杂控件嵌入到工具栏中。下面是如何向工具栏添加一个带有下拉菜单的按钮的例子: ```cpp if (m_wndToolBar.CommandToIndex(ID_MYCOMMAND_DROPDOWN) == -1) { UINT uiBtns[] = { ID_SUBMENU_ITEM1, ID_SUBMENU_ITEM2 }; CMFCDropDownToolbarMenu menu(&m_wndToolBar, ID_MYCOMMAND_DROPDOWN, _T("Dropdown Menu"), uiBtns, sizeof(uiBtns)/sizeof(UINT)); menu.AddSeparator(); menu.AddItem(ID_SUBMENU_ITEM3, _T("Third Item")); m_wndToolBar.InsertDropDownButton(ID_MYCOMMAND_DROPDOWN, menu); } ``` 这里演示了如何将一个带子菜单的按钮插入到工具栏中[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值