【问题标题】:Hide, show, add or remove buttons from ribbon?从功能区隐藏、显示、添加或删除按钮?
【发布时间】:2020-02-02 04:03:17
【问题描述】:

有没有人知道是否可以在运行时隐藏、显示、添加或删除功能区栏中的按钮?可能吗?我想让一个按钮只出现在 DEBUG 版本中。

【问题讨论】:

  • 这可能与您创建功能区的方式不同...您使用的是 GUI 框架吗?我个人认为无论如何使用功能区都是个坏主意,它需要比经典菜单更多的空间,并且需要更多的点击(通常)......
  • 是的,我只是使用默认的 MFC 功能区。微软对功能区栏做了很多研究,认为它有很多优势。我倾向于同意,我可以解释很多原因。当然,您仍然可以选择使用任何您想要的菜单来创建自己的应用程序。
  • 您还需要考虑微软总是需要新功能,并确保他们确实推广它。微软对此事的看法并不完全中立。即使 10 年后,丝带仍然存在争议。所以实际上,你能做的最好的就是提供both,所以任何人都可以根据她/他的个人喜好选择......
  • @Aconcagua:嗯,我设计用户界面已经 30 多年了。我对界面的选择很满意。我只是希望有一种直接的方式来隐藏或显示功能区按钮。
  • 而且会有用户对这个决定不满意(除非你只是为自己写的)。实际上,我并没有那么反对丝带本身(尽管认为这是一个糟糕的概念),但更多的是没有选择。不过,我非常了解,如果您不想投入精力同时实现两者。真正遗憾的是,MS 错过了实现这些项目,使它们可以同时显示为菜单或功能区,两个光学变体的同一事物。讨论结束了,任何人都会使用她/他想要的任何东西......

标签: c++ mfc ribbon cmfcribbonpanel


【解决方案1】:

10 年前,在引入功能区资源文件之前,如果您选择功能区 gui,则以编程方式在 CMainFrame::OnCreate 中添加按钮实际上是唯一的方法。应该是这样的:

CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory (_T("File"), IDB_TOOLBAR_16, IDB_TOOLBAR_32);
pMainPanel->Add (new CMFCRibbonButton (ID_FILE_NEW, "&New\nStrg+N", 0, 0));
pMainPanel->Add (new CMFCRibbonButton (ID_FILE_OPEN, "&Open...\nStrg+O", 1, 1));
pMainPanel->Add (new CMFCRibbonButton (ID_FILE_SAVE, "&Save\nStrg+S", 2, 2));
pMainPanel->Add (new CMFCRibbonButton (ID_FILE_SAVE_AS, "Save &as\nStrg+U", 3, 3));
#ifdef _DEBUG
    pMainPanel->Add (new CMFCRibbonButton (ID_FILE_DEBUG_INFO, "Show &Debug Information\nStrg+D", 4, 4));
#endif

【讨论】:

  • 如果您使用 Visual Studio 2008,这肯定会起作用。我只是没有使用最新版本的 Visual Studio 尝试此操作,但您应该能够毫无问题地获取应用程序的 CMFCRibbonMainPanel,然后从中获取正确的面板和 Add 按钮以编程方式显示,如代码 sn- p.
【解决方案2】:

这就是我想出的。我将这段代码放在InitInstance() 中调用pFrame->LoadFrame(IDR_MAINFRAME, ...); 的行之后。

#ifdef _DEBUG
    CMFCRibbonBar* pRibbon = pFrame->GetRibbonBar();
    CMFCRibbonCategory *pCategory = pRibbon->AddCategory(_T("DEBUG"), NULL, NULL);
    CMFCRibbonPanel *pPanel = pCategory->AddPanel(_T("DEBUG"));
    pPanel->Add(new CMFCRibbonButton(ID_DEBUG_RUN, _T("Run")));
    pRibbon->RecalcLayout();
#endif

我没有找出代码来查找特定类别(选项卡)和面板,而是决定一个新的专用类别和面板最适合我的目的。

当然,如果没有处理程序,按钮将被禁用。此外,如果不调用 RecalcLayout(),则在我单击其中一个选项卡之前不会显示新类别。

看起来效果不错。

【讨论】:

    【解决方案3】:

    pRibbon->RecalcLayout() 在我的代码中不够用 (Visual C++ 2012) 使用后才正确渲染pRibbon->ForceRecalcLayout()

    【讨论】:

      猜你喜欢
      • 2022-05-01
      • 2011-12-05
      • 2018-08-29
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多