1、MFC功能包 在VS08 SP1中所含的VC08的MFC功能包(MFC Feature Pack for Visual C++ 2008)中,包含了对MFC库的扩展,以支持时髦的现代用户界面(UI)元素,如Office Fluent(流畅)UI、停靠窗口和MDI选项卡(tab)窗口(似Visual Studio 2005/2008)、增强型工具条、丰富的新控件集、支持总体视觉样式(overall visual style)、支持桌面报警(desktop alerts)等等。程序员可以利用该功能包编写具有类似于微软公司的新版Microsoft Office、Visual Studio或Inte
2、rnet Explorer界面视觉样式的应用程序。 MFC功能包的改进主要体现在新型用户界面上,主要包括:功能区(ribbon)、选项卡(tab)窗口和窗格(pane)、视觉样式切换(换肤)、可停靠与自动隐藏的控制条和窗格等。 此功能包的帮助信息,位于MSDN的“目录\开发工具和语言\Visual Studio文档\Visual C++\参考信息\Libraries Reference\MFC Feature Pack for Visual C++ 2008”(主要内容在其中的“Reference\Classes”子目录中)。 5.1 新增功能 下面列出MFC功能包在若干方面增加的具
3、体新功能: 1.菜单(Menu) l 微软Office样式的菜单。 l Office样式的菜单条——你可以停靠,而且还可以用图片来定制。 l 菜单动画——图片淡入/渐显(fades in)、展开(unfolds)或滑进视图(slides into view)。 l 菜单阴影。 l 菜单工具提示(tooltips)。 l 可滚动菜单。 l 自绘(owner-drawn)菜单图片。 l 位于菜单左边的自绘标识(logo)。 l 可在运行时修改菜单字体。 l MRU(Most Recently Used,最近使用)列表和窗口列表。 l 可去掉的菜单(Tear-off menu
4、s)。 l 右对齐的组合框(似Office 2003菜单条右端的帮助组合框)。 2.工具条(Toolbars) l 按钮图片——可在鼠标悬浮(hovers over,盘旋)于按钮上时更换。 l 大图标。 l 双波浪式(double-chevron)按钮——表示存在比当前可见部分更多的按钮。 l 不可定制的工具条。 l 在菜单和工具提示中自动创建键盘快捷键。 l 支持钢筋(Rebar,一种子窗口容器)。 l 图片下的文本。 l 标准的组合框和文本框按钮。 l 标准字体组合框和字体大小组合框按钮。 l 标准颜色选择器控件。 l MS Office视觉样式(visual s
5、tyles)。 l 具有不截图的透明工具条。 l 包含钉销钮的下拉式可移去窗格(Drop-down tear-off panes that contain a pin button)。 3.窗格(Panes) 窗格是一种窗口,通常是可调整大小、可移去和可停靠的(Panes are windows that are typically resizable, tear-off, and dockable)。窗格支持如下功能: l MS Office样式的对话框条。 l Office样式的菜单条——支持图片和停靠。 l MS Outlook样式的快捷条(shortcut bar)。
6、 l Outlook样式的标题条(caption bar)。 l Outlook样式的任务窗格(task pane)。 l Visual Studio样式的窗格——类似的工具条、属性和浏览器窗格(resemble toolbox, property, and browser panes)。 l 钢筋(Rebar)控件——其内容和位置在应用程序的多次运行之间持续不变。 l 状态条——支持图标、动画和进度条。 l 打印预览服务。 4.功能区控件(Ribbon Control) 功能区(Ribbon:缎丝带、带状物、条板。微软:功能区、带状条、格式栏)是新的Microsoft Offi
7、ce Fluent用户界面 (UI) 的一部分。在面板设计器中,功能区包含一些用于创建、编辑和导出面板及其元素的上下文工具。 l 通用功能区特性(General ribbon features)。 l Vista Aero集成(航空主题是Windows Vista的默认样式)。 l 功能区窗格。 l 功能区上下文的类别(选项卡标签)(Ribbon contextual categories (tabs))。 l 功能区元素。 l 功能区键提示(keytips)。 l 功能区调色板(图表种类[galleries])。 l 功能区用户化定制。 l 功能区最小工具条。 l 功能区
8、启动(Launch)按钮。 l 功能区主(Main)按钮。 l 功能区状态条。 5.桌面报警(Desktop Alert) 微软的Outlook桌面报警,显示一个包含通知的弹出窗口,如Outlook收件箱中的通知邮件到达消息的窗口。 6.控件(Controls) l URL链接钮。 l 装饰有位图图片的按钮。 l 菜单钮。 l 可编辑列表。 l 颜色选择器控件。 l 壳(Shell)树控件。 l 壳列表控件。 l 屏蔽的(Masked)编辑控件。 l 定制的(Custom)工具提示控件。 l 包含浏览钮的编辑控件。 l 属性格(Property grid)。
9、 l MDI选项卡(tab)控件。 l 选项卡控件——支持诸如三维、Excel、OneNote等视觉样式。 7.对话框(Dialog Boxes) l Windows管理器对话框。 l Office样式的颜色选择对话框。 l 图片编辑器对话框。 l 属性单(Property sheets)——包含若干控件,诸如快捷条、树控件或Office 2007样式列表等。 8.定制(Customization) 用户可自定义控件的颜色、图片和文本等。 l 位于工具条和菜单之间的拖拉钮(drag button)。 l 使用简单的位图编辑器来编辑自定义的(user-defined)图片。
10、 l 在运行时创建自定义的工具条。 l 定制上下文菜单。 l 使用工具条定制 菜单来快速定制工具条按钮。 l 使用菜单资源来自动创建用户化类别(customization categories)。 l 利用按下Alt键并拖曳工具条按钮来定制工具条。 l 定制鼠标事件处理。 l 定制快捷键。 l 保存和恢复工具条与菜单的状态到注册表。 l 访问工作区(workspace)管理器以保持定制的设置到注册表。 l 调用自定义工具。 9.可视化(Visualization) MFC提供了可视化管理器,它按照用户选择的视觉样式来绘制控件。可视化支持如下视觉样式: l Micro
11、soft Office 2000/XP/2003/2007视觉样式。 l Visual Studio 6.0/.NET/2005视觉样式。 10.特殊功能(Special Features) MFC支持如下窗口功能: l MDI选项卡组(tabbed groups)。 l 可分离的选项卡。 l 自动隐藏窗口。 MFC还支持如下操作: l 保存和装入已打开文档的状态。 l 将若干窗格停靠到浮动的袖珍(mini)框架窗口。 l 运行时改变停靠类型: n 标准——在拖动窗口期间不画窗口的内容(如Microsoft Visual Studio .NET 2003)。 n 立
12、即——在拖动窗口期间画窗口的内容(如Microsoft Visio)。 n 灵巧(Smart)——在拖动窗口期间画窗口的内容而且有一箭头标记指出窗口可停靠的位置(如Microsoft Visual Studio 2005/2008)。 l α混合图片(支持32位图片)。 l 按从右到左(RTL = Right-To-Left)的格式显示全球化文本。 l 允许可达性支持(Enable accessibility support)。 5.2 视觉样式切换 下面我们通过一个简单的例子,展示一下MFC功能包的视觉样式切换效果。 为此,我们创建一个单文档界面的MFC应用程序FP1。在“M
13、FC应用程序向导”对话框的“应用程序类型”页(参见下图),选中“应用程序类型”栏的“单个文档”单选项、选中“项目类型”栏的“MFC标准”单选项,其它保持不变(如“视觉样式和颜色”栏的下拉式列表中为“Visual Studio 2005”选项、“启动视觉样式切换”复选框是选中的),按“完成”钮生成FP1项目。 直接编译运行的结果如下图所示: Visual Studio 2005视觉样式 在其“视图”菜单中有一个“应用程序外观”子菜单,其中包含如下菜单项(参见下图): l Windows 2000 l Office XP l Windows XP l Office 2
14、003 l Visual Studio.NET 2005(缺省值) l Office 2007 n 蓝色样式 n 黑色样式 n 银色样式 n 水绿色样式 缺省的视觉样式为我们在在“MFC应用程序向导”对话框的“应用程序类型”页“视觉样式和颜色”栏的下拉式列表中所选中的选项(Visual Studio 2005)。 下面是其它视觉样式的效果图: Windows 2000 Office XP Windows XP Office 2003 Office 2007的蓝色样式 Office
15、2007的黑色样式 Office 2007的银色样式 Office 2007的水绿色样式 5.3 自定义设置 在程序的“视图”菜单的“工具栏和停靠窗口”子菜单中,还有一个“自定义”菜单项,利用其弹出的对话框,可以进行许多自定义设置(似MS Word 2003)。下面是“自定义”对话框的若干设置页: “命令”页 “工具栏”页 “键盘”页 “菜单”页 “选项”页 1.增删工具栏按钮 可以按工具栏右端的工具栏选项钮,利用弹出的“添加或删除按钮”子菜单中的“标准”子菜单,来增/删(显示/隐藏)标准工具栏中的按钮。参见下图
16、 利用工具栏选项的“添加或删除按钮”子菜单中的“自定义”菜单项(或利用程序“视图”菜单的“工具栏和停靠窗口”子菜单中的“自定义”菜单项)弹出的“自定义”对话框的“命令”页,还可以使用各菜单中的菜单项来可视化地交互增删、分组、调位工具栏上的按钮(或菜单项)(似MS Office和MS Visual Studio)。 2.新建工具栏 利用“自定义”对话框的“工具栏”页(参见下图),可以在运行时为应用程序动态创建新的工具栏,并在其中增加若干(菜单项或)按钮。具体的做法是: 在对话框中按“新建”钮,在弹出的“工具栏名称”对话框中输入新工具栏的名称,如“编辑”,按“确定”关闭此对话框。
17、参见下图: 利用“自定义”对话框的“命令”页,向出现的浮动空工具栏中添加若干菜单项按钮,如“编辑”菜单中的“剪切”、“复制”和“粘贴”菜单项按钮:。可以将新加的工具栏停靠到自己喜欢的位置,如标准工具栏之下,参见下图: 3.设置快捷键 利用“自定义”对话框的“键盘”页,可以在运行时为应用程序动态添加菜单项对应的快捷键。具体做法是,在对话框中左上部的“类别”栏的下拉式列表中选择一菜单(如“文件”),在其下的“命令”栏的列表中选择一菜单项(如“打印预览”),定位于对话框中下部的“按新快捷键”栏下的文本编辑框,按快捷键组合键(如Ctrl+R),再按对话框的“分配”钮完成操作。参见下图:
18、 如果你选择的组合键已经被分配给了本程序的其它菜单项(此时在该文本编辑框下面的“已分配给:”之下,会显示此组合键所原来所对应的菜单项名串),则“分配”钮是灰色不可用的。 另外,按对话框的“删除”钮,可以删除当前菜单项的已有快捷键。按对话框的“全部重置”钮,可以恢复初始的快捷键设置(你在程序运行后所作的快捷键设置将全部作废)。 4.切换菜单 利用“自定义”对话框的“菜单”页左边的“应用程序框架菜单”栏的“显示菜单”下拉式列表,可以在框架窗口的多个菜单中进行强制切换,参见下图。 例如,对多文档界面的应用程序,可以在未打开子窗口时的(含3个下拉菜单的)“默认菜单”和打开子窗口后的(
19、含5个下拉菜单的)与应用程序项目同名的菜单之间进行强制切换。 5.编辑上下文菜单 利用“自定义”对话框的“菜单”页右边的“上下文菜单”栏的“选择上下文菜单”下拉式列表,可以在选择已有的上下文菜单(如“编辑”)后,再切换到“命令”页,然后就可以通过交互式可视操作来编辑该上下文菜单,包括增加、删除、移位、分组菜单项等。参见下二图。 6.工具栏和菜单选项 利用“自定义”对话框的“选项”页(参见下图)上部的“工具栏”,可以选择是否“在工具栏上显示屏幕提示”(即鼠标悬浮时的tip),以及是否“在屏幕提示中显示快捷键”。它们的区别如:或。 还可以在“选项”页中选择工具栏是否使用“大图
20、标”(参见下二图): 利用 “选项”页下部的“个性化菜单和工具栏”,选择是否“菜单首先显示最近使用的命令”,以及是否在“短暂延迟后显示完整菜单”,参见下图: (a) 首先显示最近使用的菜单项 (b) 短暂延迟后显示完整菜单 (c) 直接显示完整菜单 5.4 库架构 1.窗口停靠 MFC功能包引入了类似于Visual Studio GUI的窗口停靠(window docking)功能。 应用程序的主框架窗口通常由CFrameWndEx或CMDIFrameWndEx类表示。主框架被称为停靠站(dock site,停靠场所/地点)。 2.控制条窗格 在M
21、FC功能包中,控制条被称为窗格(pane),是从CBasePane类派生的。而传统控制条基类为CControlBar。参见右图(其中带星号的为功能包新增的类)。 窗格的父窗口可为以下三种类型之一:停靠站、停靠条(dock bar)或袖珍框架窗口(mini-frame window)。参见下图。 有两类窗格:非大小可调的(non-resizable)及大小可调的(resizable)。大小可调的窗格(如状态条和工具条)可以使用分隔条(splitter)或滑条(slider)来调整大小。大小可调的窗格可构成容器(form container)(一个窗格可被停靠到另一个窗格,在它们之间生成一个分
22、隔条)。然而,大小可调的窗格不能被粘接(停靠)到停靠条。非大小可调的窗格从CPane类派生,而大小可调的窗格则从CDockablePane类派生。 MFC功能包创建的应用程序 3.停靠站 在应用程序中,停靠站(dock site)(即主框架窗口)拥有所有的窗格和袖珍框架窗口。停靠站包含一个CDockingManager成员,该成员维护着属于此停靠站的所有窗格的一个列表。该列表是排好序的,使得在外部边界上创建的窗格,被放在列表的开始处。在架构(framework)重绘停靠站时,它会遍历该列表,调整其中每个窗格的布局,以放入停靠站的当前矩形范围中。在你需要调整停靠布局时,可以调用Adju
23、stDockingLayout或RecalcLayout函数,架构会重定向这一调用到停靠管理器。 4.停靠条 每个主框架窗口都可以沿其边框放置停靠条。停靠条(dock bar)是一个属于CDockSite类的窗格。停靠条可以接受派生于CPane的对象,如工具条。在主框架窗口初始化时,调用(CBasePane类的)EnableDocking函数来创建停靠条、调用(CDockablePane类的)EnableAutoHideBars函数来激活自动隐藏条。EnableAutoHideBars创建CAutoHideDockSite对象,并放置它们紧邻每个停靠条。 每个停靠条被分成若干停靠行(do
24、ck row),停靠行由CDockingPanesRow类表示。每个停靠行包含一个工具条列表。如果用户停靠一个工具条或将工具条从一个停靠行移动到同一停靠条的另一个停靠行时,架构会或者创建一个新的停靠行并相应地调整停靠条的大小;或者放置该工具条到一个已存在的停靠行上。 5.袖珍框架窗口 袖珍框架窗口(mini-frame window)是一种位于迷你型框架窗口中的浮动窗格。它由(只能包含唯一一个窗格的)CMDITabInfo类和(可以包含几个窗格的)CMultiPaneFrameWnd类来表示。你可以在代码中,通过调用CBasePane::FloatPane函数来浮动窗格。当窗格浮动后,架构
25、会自动创建一个袖珍框架窗口,而且该袖珍框架窗口成为浮动窗格的父窗口。在浮动的窗格停靠时,架构会重置其父窗口,而且浮动窗格变成一个停靠条(对工具条)或一个停靠站(对大小可改变的窗格)。 6.窗格分隔器 窗格分隔器(pane divider)(也叫滑条[slider]或分隔条[splitters])由CPaneDivider类表示。在用户停靠窗格时,架构会创建窗格分隔器,不管该窗格是停靠在停靠站还是另一个窗格之中。当窗格停靠到停靠站时,窗格分隔器会调用默认的窗格分隔器。默认窗格分隔器,负责所有停靠进停靠站的窗格的排列布局。停靠管理器维护着一个默认窗格分隔器的列表和一个窗格的列表。停靠管理器负责
26、所有停靠窗格的排列布局。 7.容器 所有大小可变的窗格(resizable pane),在相互停靠时,都被维护在容器(container)中。容器由CPaneContainer类表示。每个容器都具有若干指针,分别指向左窗格、右窗格、左子容器、右子容器、和左右部分之间的分隔条。(其中的左和右不是指物理上的边侧,而是标识树结构的分支。)用这种方式,我们可以建造一棵窗格和分隔条的树,从而可达成复杂的窗格布局,改变窗格大小以使它们合在一起。CPaneContainer类维护容器树,它也维护位于此树中的两个窗格和分隔条列表。窗格容器管理器通常被植入带有多个窗格的默认滑条和袖珍框架窗口之中。 8.自
27、动隐藏控制条 在默认情况下,每个CDockablePane都支持自动隐藏特性(auto-hide feature)。当用户单击CDockablePane标题上的钉栓(pin)钮时,架构会切换窗格到自动隐藏模式。为了处理单击,架构会创建一个CMFCAutoHideBar类和一个CMFCAutoHideButton类以及CMFCAutoHideBar对象。架构将新的CMFCAutoHideBar放到CAutoHideDockSite中。架构还将CMFCAutoHideButton附加到工具条。CDockingManager类维护CDockablePane。 9.选项卡控制条与Outlook条
28、 CMFCBaseTabCtrl类实现具有可分标签(tab)的选项卡(tabbed)窗口的基本功能。为了使用CMFCBaseTabCtrl对象,须在你的应用程序中初始化CBaseTabbedPane类。CBaseTabbedPane派生于CDockablePane,维护着一个指向CMFCBaseTabCtrl对象的指针。CBaseTabbedPane使用户能够停靠和调整选项卡控制条(tabbed control bar)的大小。可使用CDockablePane::AttachToTabWnd函数,来动态创建被停靠和标签(tabbed)的控制条。 Outlook(景色)条(bar)控件也是基于
29、选项卡条的。CMFCOutlookBar类派生于CBaseTabbedPane。Outlook条是一种选项卡窗格(tabbed pane),具有Microsoft Outlook 2000 或Outlook 2003中的导航窗格(Navigation Pane)的可视外观。CMFCOutlookBar对象包含一个CMFCOutlookBarTabCtrl类的对象和一系列选项卡。选项卡(tab)可以是一个CMFCOutlookBarPane类对象或是一个CWnd派生类的对象。对用户来说,Outlook条表现为一系列按钮和一个显示区域。当用户单击一个按钮时,对应的控件或窗格就被显示出来。 5
30、5 应用程序架构 1.类层次结构 下图是传统MFC应用程序架构所涉及主要类的层次结构: CObject CCmdTarget CWnd CWinTread CWinApp CFrameWnd CView CMDIFrameWnd CMDIChildWnd CScrollView CDocTemplate CDocument CSingleDocTemplate CMultiDocTemplate CTestApp CMainFrame CTestView CChildFrame CTestDoc MFC类 你的应用程序类 MFC应用程
31、序项目(Test)中的主要类及其基类 为了能支持新图形用户界面,VC08的MFC功能包增加了这些基类的扩展版,如应用程序类C*App的基类是从CWindApp派生的CWindAppEx类、单文档应用程序的主框架窗口类CMainFrame的基类是从CFrameWnd派生的CFrameWndEx类、多文档应用程序的主框架窗口类CMainFrame的基类是从CMDIFrameWnd派生的CMDIFrameWndEx类、多文档应用程序的子框架窗口类CChildFrame的基类是从CMDIChildWnd派生的CMDIChildWndEx类。文档类和文档模板类则没有变化。参见下图(的蓝色部分):
32、 CObject CCmdTarget CWnd CWinTread CWinApp CFrameWnd CView CScrollView CDocTemplate CDocument CSingleDocTemplate CMultiDocTemplate CTestApp CMainFrame CTestView CChildFrame CTestDoc MFC类 你的应用程序类 CWinAppEx CFrameWndEx CMDIFrameWnd CMDIChildWnd CMDIFrameWndEx CMDIChildWndEx MF
33、C功能包扩展类 MFC功能包应用程序项目(Test)中的主要类及其基类 许多新功能都依赖于新版本的CWinAppEx、CFrameWndEx和CMDIFrameWndEx类,这些类代表着大多数MFC应用程序的基础。这些新的基类提供了支持众多新用户界面功能(如可停靠、可调整大小的窗口窗格以及工作区持久性等)所需的全部要素。 2.最小功能包应用程序 本小节的代码显示了可支持功能区栏的最小应用程序对象。如你所见,CMinApp类由CWinAppEx派生而来,可实现大家所熟悉的InitInstance成员函数(通常用于创建应用程序的主窗口)。千万不要忘记调用SetRegistryKey
34、成员函数来设置应用程序设置的注册表位置,因为架构类要依赖于它。然后,InitInstance继续以通常的方式创建主窗口。
似绪论中的最小MFC程序,需先创建一个名为Min的“Visual C++/Win32”的“Win32项目”,在其“应用程序设置”页中的“附加选项”栏中,选中“空项目”。并修改项目属性中的“配置属性/常规”页中的“项目默认值”栏的“MFC的使用”为“在静态库中使用MFC”或“在共享DLL中使用MFC”。然后将下面的最小VC08 MFC功能包应用程序的具体代码之CPP文件添加到该项目中:
// Min.cpp
#include
35、
36、itInstance(); }; BOOL CMinApp::InitInstance() { SetRegistryKey(L"SYSU\\MinSample"); m_pMainWnd = new CMainWindow; // 此处不能直接使用CFrameWndEx类的 //(保护型)缺省构造函数 m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMinApp theApp; 运行结果如下图所示:
37、 3.Office功能区用户界面 利用MFC的功能包,我们可以非常轻松地向MFC框架窗口添加与Microsoft Office 2007系统功能区元素类似的功能区栏。 从概念上讲,功能区(ribbon)由多个被称为类别(category)的选项卡(tab)组成,每个选项卡都承载着一组面板(panel,画板/嵌板/仪表板/配电盘)。反过来,这些面板又承载着功能区元素或控件,它们分别代表特定于应用程序的各种操作。如果功能区承载着应用程序按钮(左上角的大圆按钮),则在用户单击应用程序按钮时所显示的弹出窗口中也会显示一个面板,它被视为功能区的主类别。 CMFCRibbonBar类可实现
38、功能区栏本身,而CMFCRibbonCMyAppButton类则代表功能区栏所承载且显示在窗口框架左上角的应用程序按钮。功能区栏通常是在WM_CREATE消息处理程序中创建和准备的。要创建功能区栏,只需调用CMFCRibbonBar的Create成员函数,以提供将其附加到其中的窗口框架的地址即可,然后根据需要填充它。AddMainCategory成员函数将主类别添加到功能区,并返回一个指向CMFCRibbonMainPanel(你可以向其中添加将要显示在此面板中的功能区元素)的指针。 通过调用AddCategory成员函数,可向其中添加更多的类别来表示功能区的选项卡。AddCategory返
39、回一个指向CMFCRibbonCategory对象(你可使用其AddPanel成员函数向其中添加面板)的指针。AddPanel返回一个指向CMFCRibbonPanel对象(可像使用功能区的主面板一样向其中添加功能区元素)的指针。最后,你可使用CMFCVisualManager:: SetDefaultManager静态成员函数来设置负责处理框架窗口的样式和外观的可视化管理器。下图显示了功能区应用程序的可能外观(假定你已为功能区栏上的按钮添加了必要的事件处理程序)。 下面的代码显示了具有功能区栏和应用程序按钮的一个最小SDI框架窗口。其中的应用程序按钮并不是必需的,但通常会与功能区栏结合
40、使用,为应用程序提供各种各样的主菜单,以代替传统的“文件”菜单。 class CMainWindow : public CFrameWndEx { DECLARE_MESSAGE_MAP() public: CMainWindow(); private: int OnCreate(CREATESTRUCT* createStruct); CMFCRibbonBar m_ribbon; CMFCRibbonCMyAppButton m_appButton; }; BEGIN_MESSAGE_MAP(CMainWindow, C
41、FrameWndEx) ON_WM_CREATE() END_MESSAGE_MAP() CMainWindow::CMainWindow() { Create(0/*class name*/, L"MFC Ribbon Sample CMyApp"/*window name*/); } int CMainWindow::OnCreate(CREATESTRUCT* createStruct) { if (-1 == __super::OnCreate(createStruct)) return -1; if (-1 == m_ribbon
42、Create(this)) return -1; m_appButton.SetImage(IDB_APP_BUTTON); m_ribbon.SetCMyAppButton(&m_appButton, CSize(45, 45)); CMFCRibbonMainPanel* appButtonMenu = m_ribbon.AddMainCategory(L"Menu", IDB_APP_BUTTON_MENU_SMALL, IDB_APP_BUTTON_MENU_LARGE); app
43、ButtonMenu->Add(new CMFCRibbonButton(ID_FILE_NEW, L"&New", 0, // small image index 0)); // large image index appButtonMenu->Add(new CMFCRibbonButton(ID_FILE_OPEN, L"&Open...", 1, // small image index 1)); // large image index appBut
44、tonMenu->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, L"E&xit", 15)); //small image index CMFCRibbonCategory* category = m_ribbon.AddCategory(L"Home", IDB_RIBBON_CAT_HOME_SMALL, IDB_RIBBON_CAT_HOME_LARGE); CMFCRibbonPanel* panel = category-
45、>AddPanel(L"Clipboard"); panel->Add(new CMFCRibbonButton(ID_EDIT_PASTE, L"Paste", 0, // small image index 0)); // large image index panel->Add(new CMFCRibbonButton(ID_EDIT_CUT, L"Cut", 1)); panel->Add(new CMFCRibbonButton(ID_EDIT_COPY, L"Copy", 2));
46、 panel->Add(new CMFCRibbonButton(ID_EDIT_SELECT_ALL, L"Select All", -1)); m_ribbon.AddCategory(L"Insert", IDB_RIBBON_CAT_HOME_SMALL, IDB_RIBBON_CAT_HOME_LARGE); CMFCVisualManager::SetDefaultManager( RUNTIME_CLASS(CMFCVisualManagerOffice2007)); CMFCVisual
47、ManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_LunaBlue); return 0; } 4.选项卡式多文档界面 MFC一直都支持 MDI 实现及其文档/视图体系结构,但下图中的左图所示的传统 MDI早已过时,用户可能会认为你的应用程序从Windows 95开始就再也没有更新过。现在,绝大多数用户都期望可通过窗口边缘的选项卡来访问多个文档,而这正是新的CMDIFrameWndEx MDI框架窗口所提供的功能,参见下图中的右图。 我们需要更新多文档/视图应用
48、程序对象以支持新的框架窗口。下面的代码显示了满足需要的最小选项卡式MDI应用程序对象。 class CMyApp : public CWinAppEx { DECLARE_MESSAGE_MAP() public: virtual BOOL InitInstance(); }; BEGIN_MESSAGE_MAP(CMyApp, CWinAppEx) ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew) END_MESSAGE_MAP() BOOL CMyApp::InitInstance() {
49、 SetRegistryKey(L"SampleCompany\\SampleProduct"); VERIFY(InitContextMenuManager()); AddDocTemplate(new CMultiDocTemplate(IDR_CHILDFRAME, RUNTIME_CLASS(Document), RUNTIME_CLASS(CMDIChildWndEx),
50、 RUNTIME_CLASS(View))); CMainWindow* mainWindow = new CMainWindow(); VERIFY(mainWindow->LoadFrame(IDR_MAINFRAME)); m_pMainWnd = mainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } 它类似于传统的 MDI 应用






