0

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

4

3 回答 3

2

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

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
于 2019-10-04T08:40:00.900 回答
0

这就是我想出的。我把这段代码放在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(),则在我单击其中一个选项卡之前不会显示新类别。

似乎运作良好。

于 2019-10-04T17:18:52.777 回答
0

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

于 2021-11-09T10:00:04.980 回答