2014-09-19 4 views
2

Я хотел бы переключиться между различными лентами для разных дочерних фреймов 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); 

ответ

1

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

+0

К сожалению, правильный ответ пришел слишком поздно, но тег MFC не так сильно смотрится. Ahahahh – Robson

+0

Использование контекстных категорий также работает очень хорошо. – Jak

+0

Вы правы, но есть некоторые случаи, когда вы специально хотите разные ленты, потому что недостаточно контекстных категорий. Вы можете думать о чем-то вроде разных профилей, но есть и тезисные состояния, которые могут быть полезны, но я никогда не тратил на них время. – Robson

1

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

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); 
     } 
Смежные вопросы