2024年2月25日发(作者:)

VS2005以后的MFC如何修改菜单的颜色

VS2005以后,MFC将Menu从MainFrame上移到了MenuBar上,因此在创建MainFrame(即调用OnCreate()中),执行到

if (!m_(this))

这句后,从MainFrame上执行GetMenu就不能获得正确的CMenu指针了,以后的GetMenu就只能返回0了。要取得CMenu指针,需要执行:

m_u();

如果想要修改菜单的风格,象以前那样利用SetMenuInfo()函数,无法改变菜单的风格。

这是由于Microsoft引入了UI管理器(VisualManager)来管理包括Menu、Tasks pane、

Auto-hide buttons、Edit box、Popup window、Ribbon control等在内的视图风格。

因此,要改变视图的风格,则需要利用这个UI管理器来实现,也可以利用它实现换肤。

以缺省生成的MFC单文档程序为例,MainFrame中有一个OnApplicationLook()函数,在该函数中对设置不同的风格管理器:

voidCMainFrame::OnApplicationLook(UINT id)

{

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);

nt(_T("ApplicationLook"), theApp.m_nAppLook);

}

CMFCVisualManager是其他UI管理器的基类(事实上,他还有一个基类:CMFCBaseVisualManager),他提供类似于Windows2000的风格。其他几种UI界面类都是从它直接或间接派生的。SetDefaultManager用来设置不同的UI界面风格类。

我们可以从CMFCVisualManager、或者其他管理器的类,继承生成一个新的类,重载其中的函数,就可以做成自己的管理器。

有关这部分内容,微软还没有提供帮助内容,具体如何做,还需要自己去分析源代码。源代码的位置是:

Microsoft Visual Studio 9.0VCatlmfcsrcmfc

虽然源代码中没有太多注释,但函数名和变量名的命名还是不错,基本上可以理解。

如果需要自定义UI管理器,建议首先决定近似于哪个风格,然后继承自该风格的类,最后再进行必须的重载。