建立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 文件处右键,点击“查看代码”,在文件的末尾处添加三行代码:
2. 将继承自CFrameWnd的CMainFrame类改为继承自CFrameWndEx,即将MainFrame头文件和源文件中的所有CFrameWnd替换为CFrameWndEx;
3. 在CMainFrame类的OnCreate函数开头添加以下两行代码:
运行程序,发现并没有Office 2007风格,而且状态栏也不见了:
将CMainFrame类的成员变量m_wndStatusBar的类型由CStatusBar改为CMFCStatusBar,运行程序,状态栏变成了Office 2007风格。
如何将菜单栏也变为Office 2007风格呢?
在MainFrame.h中声明CMFCMenuBar类型的变量m_wndMenuBar,在CMainFrame类的OnCreate函数中添加以下代码:
如何修改文档的标题呢?
在CMainFrame类的PreCreateWindow函数中添加以下代码:
此时,文档的标题有“无标题-”字样,在PreCreateWindow函数中添加以下代码去除:
最终生成的Office2007风格的MFC单文档应用程序
OnCreate函数的代码:
PreCreateWindow函数的代码:
项目资源:http://download.csdn.net/detail/sdupzy/9289193
但是,如果在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
相关文章推荐
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程
- MFC绘制不规则窗体的方法
- IE8引发 VS2005/2008 MFC向导出错的解决方案
- MFC实现全屏功能代码实例
- 使用VS2010创建MFC ActiveX工程项目
- C++中MFC Tab Control控件的使用详解
- MFC程序设计常用技巧汇总
- MFC扩展DLL中导出类和对话框的实现方法
- VC中SDK与MFC的区别浅析
- 浅谈MFC 改变控件大小和位置
- VC MFC非模态对话框的实现方法