C++ 在MDI应用程序中的不同功能区之间切换
我想在应用程序中为不同的MDI子帧在不同的色带之间切换。我知道用老式菜单是可能的,但我不能用功能包色带 使用旧式菜单时使用的代码:C++ 在MDI应用程序中的不同功能区之间切换,c++,mfc,ribbon,mdi,mfc-feature-pack,C++,Mfc,Ribbon,Mdi,Mfc Feature Pack,我想在应用程序中为不同的MDI子帧在不同的色带之间切换。我知道用老式菜单是可能的,但我不能用功能包色带 使用旧式菜单时使用的代码: pDocTemplate = new CMultiDocTemplate( IDR_MAINFRAME,//Menu to load RUNTIME_CLASS(CModDoc), RUNTIME_CLASS(CModFrame), // custom MDI child frame RUNTIME_CLASS(CdotView));
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);
我最终隐藏了原来的ribbonbar,然后加载并显示了一个新的ribbonbar。但不确定这是否是最好的方法
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);
}
不需要有多个对象。如果不需要,可以使用,然后必须使用方法将更改应用到用户界面。
请记住检查的返回值,以确保加载成功,并且调用非常重要,否则您将看不到新功能区。遗憾的是,正确答案来得太晚,但MFC标记不太受关注。哈哈哈,您是对的,但在某些情况下,您特别需要不同的功能区,因为仅具有上下文类别是不够的。您可以考虑使用不同的配置文件,但也有可能有用的功能区状态,但我从未在它们上花费时间。