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

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

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