Скрыть, показать, добавить или удалить кнопки с ленты?

Кто-нибудь понял, можно ли скрыть, показать, добавить или удалить кнопку с ленты во время выполнения? Является ли это возможным? Я бы хотел, чтобы кнопка отображалась только в сборках 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()

Другие вопросы по тегам