You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何隐藏CMFCToolBar的「添加或删除按钮」选项及下拉三角并保留停靠功能

解决CMFCToolBar停靠、隐藏默认菜单项、移除下拉三角及禁用按钮自定义的方案

1. 保留停靠功能并隐藏框架自动生成的菜单项

框架自动生成的工具栏相关菜单项(通常在「窗口」菜单下),可通过两种方式处理:

  • 直接移除菜单条目:在CMainFrame::OnCreate初始化工具栏后,定位到对应子菜单并删除目标项:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
    TRACE0("Failed to create toolbar\n");
    return -1;
}

// 定位窗口子菜单(索引需根据实际菜单结构调整)
CMenu* pWindowMenu = GetMenu()->GetSubMenu(3);
if (pWindowMenu)
{
    // 按位置移除「工具栏」菜单项
    pWindowMenu->RemoveMenu(0, MF_BYPOSITION);
}

// 启用停靠功能
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
  • 阻止默认菜单项生成:重载CMainFrame::OnUpdateControlBarMenu,不调用基类实现:
void CMainFrame::OnUpdateControlBarMenu(CCmdUI* pCmdUI)
{
    // 空实现,避免框架自动生成工具栏/状态栏相关菜单项
}

2. 移除或屏蔽工具栏的下拉三角

CMFCToolBar的下拉三角用于唤起自定义按钮菜单,可通过两种方式移除:

  • 直接修改工具栏属性:初始化后关闭自定义按钮显示:
m_wndToolBar.m_bShowCustomizeButton = FALSE;
m_wndToolBar.RecalcLayout();
  • 重载工具栏类重写绘制逻辑:自定义继承自CMFCToolBar的类,空实现下拉三角的绘制:
class CMyToolBar : public CMFCToolBar
{
protected:
    virtual void OnDrawMenuButton(CDC* pDC, const CRect& rect, CMFCToolBarMenuButton* pButton, BOOL bHorz) override
    {
        // 不绘制下拉三角按钮
    }
};

随后将原CMFCToolBar m_wndToolBar替换为CMyToolBar m_wndToolBar即可。

3. 禁用「添加或删除按钮」选项

要完全屏蔽按钮自定义功能,可通过以下两种方式:

  • 锁定工具栏自定义模式:初始化工具栏后锁定自定义:
m_wndToolBar.SetCustomizeMode(FALSE);
m_wndToolBar.LockCustomize();
  • 屏蔽右键菜单:在自定义工具栏类中重载OnContextMenu,不显示默认右键菜单:
void CMyToolBar::OnContextMenu(CWnd* pWnd, CPoint point)
{
    // 空实现,阻止显示包含「添加或删除按钮」的右键菜单
}

内容的提问来源于stack exchange,提问作者liao xiaoxia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:34:56