Переключение между разными лентами в приложении MDI

Я хотел бы переключаться между разными лентами для разных дочерних фреймов MDI в моем приложении. Я знаю, что это возможно с меню старого стиля, но я не могу заставить его работать с лентами пакета функций.

Код, используемый, когда это меню в старом стиле:

pDocTemplate = new CMultiDocTemplate(
    IDR_MAINFRAME,//Menu to load
    RUNTIME_CLASS(CModDoc),
    RUNTIME_CLASS(CModFrame), // custom MDI child frame
    RUNTIME_CLASS(CdotView));
if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);

pDocTemplate = new CMultiDocTemplate(
    IDR_RES_RNGACTIV,//Menu to load
    RUNTIME_CLASS(CModRangeDoc),
    RUNTIME_CLASS(CModRangeFrame), //custom MDI child frame
    RUNTIME_CLASS(CBlankView));
if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);

Другой подход, о котором я думаю, - это выгрузить текущую ленту и загрузить новую ленту из ресурсов?

//Unload ribbon code?
m_wndRibbonBar.LoadFromResource(IDR_RIBBON);

person Jak    schedule 19.09.2014    source источник


Ответы (2)


нет необходимости иметь несколько CMFCRibbonBar объекты, если вам это не нужно, вы можете просто использовать CMFCRibbonBar :: LoadFromResource, а затем вам нужно будет использовать CMFCRibbonBar :: RecalcLayout, чтобы применить изменения к пользовательскому интерфейсу. Не забудьте проверить возвращаемое значение CMFCRibbonBar :: LoadFromResource, чтобы убедиться, что загрузка прошла успешно, и действительно важно, чтобы вы вызывали CMFCRibbonBar :: RecalcLayout, иначе вы не увидите новую ленту.

person Robson    schedule 29.10.2014
comment
к сожалению, правильный ответ пришел слишком поздно, но тег MFC не особо присматривался ахахахх - person Robson; 29.10.2014
comment
вы правы, но в некоторых случаях вам нужны разные ленты, потому что недостаточно иметь только контекстные категории. Вы можете подумать о чем-то вроде разных профилей, но есть также состояния ленты, которые могут быть полезны, но я никогда не тратил на них время. - person Robson; 03.11.2014

В итоге я скрывал исходную ленточную панель, а затем загружал и отображал новую. Не уверен, что это лучший способ сделать это.

    CMultiDocTemplate *pDoc = GetDocTemplate(7);
    if (pDoc)
    {
        CFloorActivDoc* pDocument = (CFloorActivDoc*)pDoc->CreateNewDocument();
        CFloorFrame* pFrame = (CFloorFrame*)pDoc->CreateNewFrame(pDocument, NULL);
        if (pFrame)
        {
            pDoc->InitialUpdateFrame(pFrame, pDocument);
            m_wndRibbonBar.ShowPane(FALSE, FALSE, TRUE);//Hide original ribbon
            m_FloorRibbonBar.Create(this);
            m_FloorRibbonBar.LoadFromResource(IDR_RIBBON_FLOORACT);
        }
person Jak    schedule 19.09.2014