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

VS2005以后,MFC将Menu从MainFrame上移到了MenuBar上,因此在创建MainFrame(即调用OnCreate()中),执行到
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()函数,在该函数中对设置不同的风格管理器:

void CMainFrame::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);

    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管理器,建议首先决定近似于哪个风格,然后继承自该风格的类,最后再进行必须的重载。

posted @ 2012-02-15 09:20  Gu-dong  阅读(3806)  评论(0编辑  收藏  举报