关闭

建立Office2007风格的MFC单文档应用程序

标签: mfcoffice2007
728人阅读 评论(0) 收藏 举报
分类:

       VS2008 SP1及之后的版本集成了BCGControlBar(MFC界面库)的部分功能,我们可以利用它建立具有Office2007风格的MFC应用程序:在MFC应用程序建立向导——应用程序类型——视觉样式和颜色,选择“Office 2007 (蓝色主题)”,也可以“启用视觉样式切换”进行换肤。

这里写图片描述

       但是,如果在MFC应用程序建立向导——用户界面功能——命令栏,选择“使用经典菜单”,则会禁用上一步选择的新外观功能,生成的应用程序将不具有Office 2007风格。

这里写图片描述

这里写图片描述
不具备Office 2007风格的单文档应用程序界面

       如何让使用经典菜单的单文档应用程序具有Office 2007风格,或者说如何给已有的项目添加Office 2007风格?
       需要进行三步设置:
       1. 在资源文件中的 .rc 文件处右键,点击“查看代码”,在文件的末尾处添加三行代码:

#if !defined(_AFXDLL)
#include "l.CHS\afxribbon.rc"   // MFC 功能区和控件条资源
#endif

这里写图片描述

这里写图片描述

       2. 将继承自CFrameWnd的CMainFrame类改为继承自CFrameWndEx,即将MainFrame头文件和源文件中的所有CFrameWnd替换为CFrameWndEx;
       3. 在CMainFrame类的OnCreate函数开头添加以下两行代码:

//设置视觉管理器使用的视觉样式
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
//设置用于绘制所有用户界面元素的视觉管理器
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

       运行程序,发现并没有Office 2007风格,而且状态栏也不见了:
       将CMainFrame类的成员变量m_wndStatusBar的类型由CStatusBar改为CMFCStatusBar,运行程序,状态栏变成了Office 2007风格。

这里写图片描述

       如何将菜单栏也变为Office 2007风格呢?
       在MainFrame.h中声明CMFCMenuBar类型的变量m_wndMenuBar,在CMainFrame类的OnCreate函数中添加以下代码:

if (!m_wndMenuBar.Create(this))
    {
        TRACE0("未能创建菜单栏\n");
        return -1;      // 未能创建
    }
    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
    // 防止菜单栏在激活时获得焦点
    CMFCPopupMenu::SetForceMenuFocus(FALSE);
    //使菜单栏可停靠
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);

这里写图片描述

       如何修改文档的标题呢?
       在CMainFrame类的PreCreateWindow函数中添加以下代码:

SetTitle("设置的标题");

这里写图片描述

       此时,文档的标题有“无标题-”字样,在PreCreateWindow函数中添加以下代码去除:

cs.style&=~FWS_ADDTOTITLE;

这里写图片描述
最终生成的Office2007风格的MFC单文档应用程序


       OnCreate函数的代码:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;


    //设置视觉管理器使用的视觉样式
    CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
    //设置用于绘制所有用户界面元素的视觉管理器
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));


    //----------------------------创建菜单栏-------------------------//
    if (!m_wndMenuBar.Create(this))
    {
        TRACE0("未能创建菜单栏\n");
        return -1;      // 未能创建
    }
    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
    // 防止菜单栏在激活时获得焦点
    CMFCPopupMenu::SetForceMenuFocus(FALSE);
    //使菜单栏可停靠
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);


    //-----------------------------创建状态栏-----------------------//
    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("未能创建状态栏\n");
        return -1;      // 未能创建
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));


    return 0;
}


       PreCreateWindow函数的代码:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWndEx::PreCreateWindow(cs) )
        return FALSE;
    // TODO: 在此处通过修改
    //  CREATESTRUCT cs 来修改窗口类或样式

    //修改文档的标题
    SetTitle("设置的标题");

    //去除标题前的"无标题"
    cs.style&=~FWS_ADDTOTITLE;

    return TRUE;
}




       项目资源:http://download.csdn.net/detail/sdupzy/9289193


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:936次
    • 积分:22
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档