Я хотел бы переключаться между разными лентами для разных дочерних кадров 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);
нет необходимости иметь несколько CMFCRibbonBar объекты, если вам не нужно, вы можете просто использовать CMFCRibbonBar :: LoadFromResource и тогда вам придется использовать CMFCRibbonBar :: RecalcLayout способ применить изменения в пользовательском интерфейсе.
Не забудьте проверить возвращаемое значение CMFCRibbonBar :: LoadFromResource чтобы убедиться, что загрузка прошла успешно, и очень важно, чтобы вы вызвали CMFCRibbonBar :: RecalcLayout в противном случае вы не увидите новую ленту.
В итоге я спрятал оригинальную ленточную панель, а затем загрузил и отобразил новую. Не уверен, что это лучший способ сделать это.
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);
}