惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
Martin Fowler
Martin Fowler
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 叶小钗
I
InfoQ
B
Blog RSS Feed
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
P
Proofpoint News Feed
WordPress大学
WordPress大学
小众软件
小众软件
B
Blog
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
量子位
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客

博客园 - Gu-dong

Coding道场:第一次 人工智能与3A 敏捷中的自组织团队 历史总是螺旋上升的 一个成功敏捷团队的失败历程 敏捷书籍推荐列表 最近一个项目的一点反省:客户价值才是关注的焦点 Scrum vs. PMP vs. PRINCE2的发展趋势图 敏捷团队谁负责? 什么是产品的愿景—从一篇博文中学得到 全栈开发与敏捷 我对敏捷的理解:实施敏捷的前提 华为EC169 3G卡在Win7下的安装 推荐一个非常优秀的SharePoint Tag Cloud Webpart 如何在SharePoint Blog中显示附件(Attachement file) 王晓阳的搜狐博客被封了 也谈谈丰田事件 重建SharePoint Service 2.0的全过程 “用户体验”——微软Tech ED2009大会有感
VS2005以后的MFC如何修改菜单的颜色
Gu-dong · 2012-02-15 · via 博客园 - Gu-dong

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