您的位置:首页 > 其它

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

2015-11-21 17:58 836 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc office2007