Скрыть, показать, добавить или удалить кнопки с ленты?
Кто-нибудь понял, можно ли скрыть, показать, добавить или удалить кнопку с ленты во время выполнения? Является ли это возможным? Я бы хотел, чтобы кнопка отображалась только в сборках DEBUG.
3 ответа
10 лет назад, до появления файлов ресурсов ленты, добавление кнопок программным способом в 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
Вот что я придумал. Я поместил этот код сразу после строки в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()
, новая категория не появится, пока я не нажму на одну из вкладок.
Кажется, работает хорошо.
pRibbon->RecalcLayout()
в моем коде недостаточно (Visual C++ 2012). Правильный рендеринг произошел только после использования
pRibbon->ForceRecalcLayout()