if (!m_wndMenuBar.Create(this))
这句后,从MainFrame上执行GetMenu就不能获得正确的CMenu指针了,以后的GetMenu就只能返回0了。要取得CMenu指针,需要执行:
m_wndMenuBar.GetMenu();
如果想要修改菜单的风格,象以前那样利用SetMenuInfo()函数,无法改变菜单的风格。
这是由于Microsoft引入了UI管理器(VisualManager)来管理包括Menu、Tasks pane、 Auto-hide buttons、Edit box、Popup window、Ribbon control等在内的视图风格。
因此,要改变视图的风格,则需要利用这个UI管理器来实现,也可以利用它实现换肤。
以缺省生成的MFC单文档程序为例,MainFrame中有一个OnApplicationLook()函数,在该函数中对设置不同的风格管理器:
{
CWaitCursor wait;
theApp.m_nAppLook = id;
switch (theApp.m_nAppLook)
{
case ID_VIEW_APPLOOK_WIN_2000:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
break;
case ID_VIEW_APPLOOK_OFF_XP:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
break;
case ID_VIEW_APPLOOK_WIN_XP:
CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
break;
case ID_VIEW_APPLOOK_OFF_2003:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
CDockingManager::SetDockingMode(DT_SMART);
break;
case ID_VIEW_APPLOOK_VS_2005:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
CDockingManager::SetDockingMode(DT_SMART);
break;
default:
switch (theApp.m_nAppLook)
{
case ID_VIEW_APPLOOK_OFF_2007_BLUE:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
break;
case ID_VIEW_APPLOOK_OFF_2007_BLACK:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
break;
case ID_VIEW_APPLOOK_OFF_2007_SILVER:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
break;
case ID_VIEW_APPLOOK_OFF_2007_AQUA:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
break;
}
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
CDockingManager::SetDockingMode(DT_SMART);
}
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
theApp.WriteInt(_T( " ApplicationLook "), theApp.m_nAppLook);
}
CMFCVisualManager是其他UI管理器的基类(他还有一个基类:CMFCBaseVisualManager),他提供类似于Windows2000的风格。其他几种UI界面类都是从它直接或间接派生的。SetDefaultManager用来设置不同的UI界面风格类。
我们可以从CMFCVisualManager、或者其他管理器的类,继承生成一个新的类,重载其中的函数,就可以做成自己的管理器。
有关这部分内容,微软还没有提供帮助内容,具体如何做,还需要自己去分析源代码。源代码的位置是(我用的是VS2008):
Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc
虽然源代码中没有太多注释,但函数名和变量名的命名还是不错,基本上可以理解。
如果需要自定义UI管理器,建议首先决定近似于哪个风格,然后继承自该风格的类,最后再进行必须的重载