文档库 最新最全的文档下载
当前位置:文档库 › Visual Studio 2008 SP1 MFC新增功能包编程简介

Visual Studio 2008 SP1 MFC新增功能包编程简介

Visual Studio 2008 SP1 MFC新增功能包编程简介
Visual Studio 2008 SP1 MFC新增功能包编程简介

第13章 MFC功能包编程简介

VS08 SP1所含的VC08的MFC功能包(MFC Feature Pack for Visual C++ 2008),在MFC 9.0的基础上增加137个新类(及86个内部类)和1个新结构。功能包对传统MFC库进行了扩展,以支持时髦的现代用户界面元素,如Office Fluent(流畅)UI、停靠窗口和MDI选项卡(tab)窗口(似Visual Studio 2005/2008)、增强型工具条、丰富的新控件集、支持总体视觉样式(overall visual style)、支持桌面报警(desktop alerts)等等。程序员可以利用该功能包编写具有类似于微软公司新版的Microsoft Office、Visual Studio或Internet Explorer等流行界面视觉样式的应用程序。

MFC功能包的改进主要体现在新型用户界面上,主要包括:功能区(ribbon)、选项卡(tab)窗口和窗格(pane)、视觉样式切换(换肤)、可停靠与自动隐藏的控制条和窗格等。

MFC功能包的帮助信息,位于MSDN的“目录\开发工具和语言\Visual Studio文档\Visual C++\参考信息\Libraries Reference\MFC Feature Pack for Visual C++ 2008”,主要内容在其“Reference\Classes”子目录中。

在VS2010中,MFC功能包已被完全并入MFC,所以其帮助系统也被并入标准的MFC 帮助系统之中,位于MSDN的“目录\开发工具和语言\Visual Studio文档\Visual C++\参考信息\Libraries Reference\MFC”,主要内容也在其“Classes”子目录中。

13.1 新增功能

MFC功能包在用户界面方面增加了许多新功能,包括对传统界面元素的改进和若干新增的界面元素。

13.1.1 传统界面元素的改进

MFC功能包,对菜单、工具条、对话框和控件等传统界面元素,进行了大量改进,以适应时髦用户界面的需要。

1.菜单

在功能包中增了微软Office新样式的菜单和菜单条,可以停靠和用(自绘)图片定制,

支持菜单阴影和滚动、菜单工具提示、运行时的菜单字体修改、菜单标识的自绘、最近使用列表和窗口列表、右对齐的组合框、可去掉的菜单(tear-off menus)等,还支持菜单动画,包括图片淡入和渐显、展开或滑进视图等。

2.工具条

功能包中的新型工具条,支持大图标和双臂章式(double-chevron)按钮(存在比当前可见部分更多的按钮),而且按钮的图片可在鼠标悬浮于按钮上时更换,并允许在图片下显示文本,还可以在菜单和工具提示中自动创建键盘快捷键。在新型工具条中,可包含钢筋(Rebar)子窗口容器、标准的组合框和文本框按钮、标准字体组合框和字体大小组合框按钮、标准颜色选择器控件,以及包含钉销钮的下拉式可移去窗格,还支持MS Office视觉样式(visual styles)和具有背景图的透明工具条。不可定制的工具条。

3.控件

功能包中新增和改进的控件有:URL链接钮、装饰有位图图片的按钮、菜单钮、可编辑列表、颜色选择器控件、壳(Shell)树控件、壳列表控件、屏蔽的(Masked)编辑控件、定制的(Custom)工具提示控件、包含浏览钮的编辑控件、属性格(Property grid)、MDI 选项卡(tab)控件、支持诸如三维、Excel、OneNote等视觉样式的选项卡控件。

4.对话框

功能包中新增和改进的对话框有:Windows管理器对话框、Office样式的颜色选择对话框、图片编辑器对话框、包含若干控件(诸如快捷条、树控件或Office 2007样式列表等)的属性单(property sheets)。

13.1.2 新界面元素

MFC功能包新增加的界面元素主要有窗格、功能区和选项卡。

1.窗格

窗格(Panes)是一种窗口,通常是可调整大小、可移去和可停靠的。窗格支持如下功能:MS Office样式的对话框条、(支持图片和停靠的)Office样式的菜单条,MS Outlook

样式的快捷条(shortcut bar)、标题条(caption bar)和任务窗格(task pane),(类似于工具条、属性和浏览器窗格)Visual Studio样式的窗格。窗格还支持(内容和位置在应用程序的多次运行之间持续不变的)钢筋(Rebar)控件、(支持图标、动画和进度条)状态条和打印预览服务。

2.功能区控件

功能区(ribbon,缎丝带/带状条)是新的Microsoft Office Fluent用户界面的一部分,用来代替传统的菜单和工具条功能。

在面板设计器中,功能区包含一些用于创建、编辑和导出面板及其元素的上下文工具。功能区控件支持:通用功能区特性(features)、Vista Aero集成(默认样式为气体主题[theme])、功能区窗格、功能区上下文的类别(categories)选项卡标签)、功能区元素、功能区键提示(keytips)、功能区调色板(图表种类[galleries])、功能区用户化定制、功能区最小工具条、功能区启动(Launch)按钮和主按钮、功能区状态条等。

3.选项卡窗口

在MFC功能包的MDI应用程序中,不再使用传统的多个独立子窗口作为文档窗口,而是使用位于主框架窗口客户区的MDI选项卡窗口(tabbed window)组,简称为选项卡组(tabbed groups)。选项卡窗口可被垂直或水平排列,如果一个应用程序具有多个MDI选项卡组,则各组之间用分隔条(splitter)分开。

MDI选项卡组具有如下特点:应用程序可动态创建选项卡窗口、应用程序可垂直或水平排列选项卡窗口、选项卡窗口组被分隔条分开、用户可使用分隔条来调整选项卡组的大小、用户可在组间拖动单个选项卡、用户可拖动单个选项卡来创建组、用户可使用快捷菜单来移动选项卡或创建新组、应用程序可以保存和装入选项卡窗口的布局和MDI文档列表、应用程序还可以访问单个选项卡组并修改它们的参数。

13.1.3 新增功能

MFC功能包新增加的其他功能有Outlook式的桌面报警、控件的定制、可视化管理和若干特殊的功能和操作。

1.桌面报警

微软的Outlook式桌面报警(Desktop Alert),显示一个包含通知的弹出窗口,如Outlook 收件箱中的通知邮件到达消息的窗口。

2.定制

用户可自定义控件的颜色、图片和文本等,包括:位于工具条和菜单之间的拖拉钮(drag button)、使用简单的位图编辑器来编辑用户定义的图片、在运行时创建自定义的工具条、定制上下文菜单、使用工具条定制菜单来快速定制工具条按钮、使用菜单资源来自动创建用户化类别(customization categories)、利用按下Alt键并拖曳工具条按钮来定制工具条、定制鼠标事件处理、定制快捷键、保存和恢复工具条与菜单的状态到注册表、访问工作区(workspace)管理器以保持定制的设置到注册表、调用自定义工具等。

3.可视化

MFC提供了可视化(visualization)管理器,它按照用户选择的视觉样式来绘制控件。可视化支持Microsoft Office 2000/XP/2003/2007视觉样式和Visual Studio 6.0/.NET/2005视觉样式。

4.特殊功能

MFC支持如下操作:自动隐藏窗口、保存和装入已打开文档的状态、将若干窗格停靠到浮动的袖珍(mini)框架窗口、α混合图片(支持32位图片)、按从右到左(RTL = Right-To-Left)的格式显示全球化文本、允许可达性(accessibility)支持。

MFC还支持运行时改变窗口的停靠类型:

?标准——在拖动窗口期间不画窗口的内容(如Microsoft Visual Studio .NET 2003)。

?立即——在拖动窗口期间画窗口的内容(如Microsoft Visio)。

?灵巧(Smart)——在拖动窗口期间画窗口的内容而且有一箭头标记指出窗口可停

靠的位置(如Microsoft Visual Studio 2005/2008)。

13.2 界面的切换与定制

与传统的MFC应用程序不同,功能包应用程序可以在运行时由用户来动态切换界面风格和定制菜单与工具条等界面元素。下面我们通过一个简单的例子,展示一下MFC功能包应用程序界面的视觉样式及主题的切换效果和强大的用户自定义功能。

13.2.1 视觉样式切换

创建一个单文档界面的MFC应用程序FP1:在“MFC应用程序向导”对话框的“应用程序类型”页(参见图13-1),选中“应用程序类型”栏的“单个文档”单选项、选中“项目类型”栏的“MFC标准”单选项,其它保持不变(如“视觉样式和颜色”栏的下拉式列表中为“Visual Studio 2005”选项、“启用视觉样式切换”复选框是选中的),按“完成”钮生成FP1项目。直接编译运行的结果如图13-2所示。

图13-1 在MFC应用程序向导中启用视觉样式切换

图13-2 Visual Studio 2005视觉样式

在应用程序的“视图”菜单中有一个“应用程序外观”子菜单,其中包含如下菜单项:Windows 2000、Office XP、Windows XP、Office 2003、Visual https://www.wendangku.net/doc/6e897281.html, 2005(默认值)、Office 2007(蓝色样式、黑色样式、银色样式、水绿色样式),参见图13-3。

图13-3 应用程序外观菜单

默认的视觉样式为我们在在“MFC应用程序向导”对话框的“应用程序类型”页“视觉样式和颜色”栏的下拉式列表中所选中的选项(Visual Studio 2005)。图13-4是若干其它视觉样式的效果图:

Windows XP Office 2003

Office 2007的蓝色样式Office 2007的黑色样式

图13-4 部分视觉样式

13.2.2 自定义设置

在程序的“视图”菜单的“工具栏和停靠窗口”子菜单中,还有一个“自定义”菜单项,利用其弹出的对话框,用户可以在程序运行时进行许多自定义设置(似MS Word 2003),图13-5是“自定义”对话框的若干设置页。

“命令”页“工具栏”页

“键盘”页“菜单”页

“选项”页

图13-5 “自定义”对话框的若干设置页

1.增删工具栏按钮

可以按工具栏右端的工具栏选项钮,利用弹出的“添加或删除按钮”子菜单中的“标准”子菜单,来增/删(显示/隐藏)标准工具栏中的按钮,参见图13-6。

图13-6 “添加或删除按钮”菜单中的“标准”子菜单利用工具栏选项的“添加或删除按钮”子菜单中的“自定义”菜单项(或利用程序“视图”菜单的“工具栏和停靠窗口”子菜单中的“自定义”菜单项)弹出的“自定义”对话框的“命令”页,还可以使用各菜单中的菜单项来可视化地交互增删、分组、调位工具栏上的按钮(或菜单项)(似MS Office和MS Visual Studio)。

2.新建工具栏

利用“自定义”对话框的“工具栏”页(参见图13-7),可以在运行时为应用程序动态

创建新的工具栏,并在其中增加若干(菜单项或)按钮。具体的做法是:

图13-7 “自定义”对话框的“工具栏”页

在对话框中按“新建”钮,在弹出的“工具栏名称”对话框中输入新工具栏的名称,如“编辑”,按“确定”关闭此对话框,参见图13-8。

图13-8 “工具栏名称”对话框

利用“自定义”对话框的“命令”页,向出现的浮动空工具栏中添加若干菜单项

按钮,如“编辑”菜单中的“剪切”、“复制”和“粘贴”菜单项按钮:。可以将新加的工具栏停靠到自己喜欢的位置,如标准工具栏之下,参见图13-9。

图13-9 停靠新工具栏到标准工具栏下

3.设置快捷键

利用“自定义”对话框的“键盘”页,可以在运行时为应用程序动态添加菜单项对应的快捷键。具体做法是,在对话框中左上部的“类别”栏的下拉式列表中选择一菜单(如“文件”),在其下的“命令”栏的列表中选择一菜单项(如“打印预览”),定位于对话框中下部的“按新快捷键”栏下的文本编辑框,按快捷键组合键(如Ctrl+R),再按对话框的“分配”钮完成操作,参见图13-10。

图13-10 利用“自定义”对话框的“键盘”页设置快捷键如果你选择的组合键已经被分配给了本程序的其它菜单项(此时在该文本编辑框下面的“已分配给:”之下,会显示此组合键所原来所对应的菜单项名串),则“分配”钮是灰色不可用的。

另外,按对话框的“删除”钮,可以删除当前菜单项的已有快捷键。按对话框的“全部重置”钮,可以恢复初始的快捷键设置(你在程序运行后所作的快捷键设置将全部作废)。

4.切换菜单

利用“自定义”对话框的“菜单”页左边的“应用程序框架菜单”栏的“显示菜单”下拉式列表,可以在框架窗口的多个菜单中进行强制切换,参见图13-11。

图13-11 利用“自定义”对话框的“菜单”页切换菜单例如,对多文档界面的应用程序,可以在未打开子窗口时的(含3个下拉菜单的)“默认菜单”和打开子窗口后的(含5个下拉菜单的)与应用程序项目同名的菜单之间进行强制切换。

5.编辑上下文菜单

利用“自定义”对话框的“菜单”页右边的“上下文菜单”栏的“选择上下文菜单”下拉式列表,可以在选择已有的上下文菜单(如“编辑”)后,再切换到“命令”页,然后就可以通过鼠标交互式可视操作来编辑该上下文菜单,包括增加、删除、移位、分组菜单项等。参见下图13-12。

a) 初始的“编辑”上下文菜单

b) 将文件菜单中的打开等菜单项拖进“编辑”上下文菜单

图13-12 利用“自定义”对话框的“菜单”页编辑上下文菜单6.工具栏和菜单选项

利用“自定义”对话框的“选项”页(参见图13-13)上部的“工具栏”,可以选择是否“在工具栏上显示屏幕提示”(即鼠标悬浮时的tip),以及是否“在屏幕提示中显示快捷

键”,它们的区别如:或。还可以在“选项”页中选择工具栏是否使用“大图标”(参见图13-13)。

图13-13 “自定义”对话框的“选项”页与设置工具条上的图标大小利用“选项”页下部的“个性化菜单和工具栏”,选择是否“菜单首先显示最近使用的命令”,以及是否在“短暂延迟后显示完整菜单”,参见图13-14。

(a) 首先显示最近使用的菜单项(b) 短暂延迟后显示完整菜单(c) 直接显示完整菜单

图13-14 是否显示完整菜单

13.3 窗口框架

MFC功能包引入了全新的窗口框架,支持窗口停靠、控制条窗格、

停靠站条、窗格容器、窗格分隔条、自动隐藏控制条、选项卡控制条

和Outlook控制条等。

13.3.1 窗口停靠

MFC功能包引入了类似于Visual Studio界面的窗口停靠

(docking)功能。应用程序的主框架窗口通常由CFrameWndEx或

CMDIFrameWndEx类表示,主框架也被称为停靠站(dock site)。

13.3.2 控制条窗格

在MFC功能包中,控制条被称为窗格(pane),是从CBasePane

类派生的。而传统控制条基类为CControlBar,参见图13-15(其中带

星号的为功能包新增类)。

窗格的父窗口可为以下三种类型之一:停靠站、停靠条、或袖珍

框架窗口,参见图13-16。图13-15 控制条窗格类

图13-16 MFC功能包创建的应用程序

有两类窗格:大小不可调的及大小可调的。大小可调的窗格(如状态条和工具条)可以使用分隔条(splitter)或滑条(slider)来调整大小。大小可调的窗格可构成容器,即一个窗格中可停靠若干其他窗格,在它们之间用分隔条分开。但是,大小可调的窗格不能被粘接(停靠)到停靠条。大小不可调的窗格从CPane类派生,而大小可调的窗格则从CDockablePane 类派生。

13.3.3 停靠站

在应用程序中,停靠站(dock site)(即主框架窗口)拥有所有的窗格和袖珍框架窗口。停靠站包含一个CDockingManager成员,该成员维护着属于此停靠站的所有窗格的一个列表。该列表是排好序的,使得在外部边界上创建的窗格,被放在列表的开始处。在架构(framework)重绘停靠站时,它会遍历该列表,调整其中每个窗格的布局,以放入停靠站的当前矩形范围中。在你需要调整停靠布局时,可以调用AdjustDockingLayout或RecalcLayout函数,架构会重定向这一调用到停靠管理器。

13.3.4 停靠条

每个主框架窗口都可以沿其边框放置停靠条。停靠条(dock bar)是一个属于CDockSite 类的窗格。停靠条可以接受派生于CPane的对象,如工具条。在主框架窗口初始化时,调

用(CBasePane类的)EnableDocking函数来创建停靠条、调用(CDockablePane类的)

EnableAutoHideBars函数来激活自动隐藏条。EnableAutoHideBars创建CAutoHideDockSite 对象,并放置它们紧邻每个停靠条。

每个停靠条被分成若干停靠行(dock row),停靠行由CDockingPanesRow类表示。每个停靠行包含一个工具条列表。如果用户停靠一个工具条或将工具条从一个停靠行移动到同一停靠条的另一个停靠行时,架构会或者创建一个新的停靠行并相应地调整停靠条的大小;或者放置该工具条到一个已存在的停靠行上。

13.3.5 袖珍框架窗口

袖珍框架窗口(mini-frame window)是一种位于迷你型框架窗口中的浮动窗格。它由(只能包含唯一一个窗格的)CMDITabInfo类和(可以包含几个窗格的)CMultiPaneFrameWnd 类来表示。你可以在代码中,通过调用CBasePane::FloatPane函数来浮动窗格。当窗格浮动后,架构会自动创建一个袖珍框架窗口,而且该袖珍框架窗口成为浮动窗格的父窗口。在浮动的窗格停靠时,架构会重置其父窗口,而且浮动窗格变成一个停靠条(对工具条)或一个停靠站(对大小可改变的窗格)。

13.3.6 窗格分隔条

窗格分隔器(pane divider)也叫滑条(slider)或分隔条(splitters),由CPaneDivider 类表示。在用户停靠窗格时,架构会创建窗格分隔条,不管该窗格是停靠在停靠站还是另一个窗格之中。当窗格停靠到停靠站时,窗格分隔条会调用默认的窗格分隔条。默认窗格分隔条,负责所有停靠进停靠站的窗格的排列布局。停靠管理器维护着一个默认窗格分隔条的列表和一个窗格的列表。停靠管理器负责所有停靠窗格的排列布局。

13.3.7 窗格容器

所有大小可变的窗格,在相互停靠时,都被维护在由CPaneContainer类表示的容器(container)中。每个容器都具有若干指针,分别指向左窗格、右窗格、左子容器、右子容器、和左右部分之间的分隔条,其中的左和右不是指物理上的边侧,而是标识树结构的分支。用这种方式,我们可以建造一棵窗格和分隔条的树,从而可达成复杂的窗格布局,改变窗格大小以使它们合在一起。CPaneContainer类维护容器树,它也维护位于此树中的两个窗格和分隔条列表。窗格容器管理器,通常被植入带有多个窗格的默认滑条和袖珍框架窗口之中。

13.3.8 自动隐藏控制条

在默认情况下,每个CDockablePane都支持自动隐藏特性(auto-hide feature)。当用户单击CDockablePane标题上的钉栓(pin)钮时,架构会切换窗格到自动隐藏模式。为了处理单击,架构会创建一个CMFCAutoHideBar类和一个CMFCAutoHideButton类以及CMFCAutoHideBar对象。架构将新的CMFCAutoHideBar放到CAutoHideDockSite中。架构还将CMFCAutoHideButton附加到工具条。CDockingManager类维护CDockablePane。

13.3.9 选项卡控制条与Outlook条

CMFCBaseTabCtrl类,实现具有可分标签(tab)选项卡(tabbed)窗口的基本功能。为了使用CMFCBaseTabCtrl对象,需在你的应用程序中初始化CBaseTabbedPane类。CBaseTabbedPane派生于CDockablePane,维护着一个指向CMFCBaseTabCtrl对象的指针。CBaseTabbedPane使用户能够停靠和调整选项卡控制条(tabbed control bar)的大小。可使用CDockablePane::AttachToTabWnd函数,来动态创建被停靠和标注(tabbed)的控制条。

Outlook(景色)条(bar)控件也是基于选项卡条的,对应的类CMFCOutlookBar也派生于CBaseTabbedPane。Outlook条是一种选项卡窗格(tabbed pane),具有Microsoft Outlook 2000 或Outlook 2003中的导航窗格(Navigation Pane)的可视外观。CMFCOutlookBar对象包含一个CMFCOutlookBarTabCtrl类的对象和一系列选项卡。选项卡(tab)可以是一个CMFCOutlookBarPane类对象,或是一个CWnd派生类的对象。对用户来说,Outlook条表现为一系列按钮和一个显示区域,当用户单击一个按钮时,对应的控件或窗格就被显示出来。

13.4 应用程序架构

MFC功能包增加了与传统的应用程序框架基类相对应的扩展类,我们可以利用这些类的手工编码来创建多种具有功能包新界面的MFC应用程序。

13.4.1 类层次结构

传统的MFC应用程序的架构类(参见图13-17下部),都是从MFC类库中的对应基类(参见图13-17上部)派生的,可参见12.2节。

为了能支持新图形用户界面,VC08的MFC功能包增加了这些基类的扩展版(参见图

13-17中部),如应用程序类C*App的基类是从CWindApp派生的CWindAppEx类、单文档应用程序的主框架窗口类CMainFrame的基类是从CFrameWnd派生的CFrameWndEx类、多文档应用程序的主框架窗口类CMainFrame的基类是从CMDIFrameWnd派生的CMDIFrameWndEx类、多文档应用程序的子框架窗口类CChildFrame的基类是从CMDIChildWnd派生的CMDIChildWndEx类。文档类和文档模板类则没有变化。

图13-17 MFC应用程序项目(Test)中的主要类及其基类许多新功能都依赖于新版本扩展类CWinAppEx、CFrameWndEx和CMDIFrameWndEx,这些类代表着大多数MFC应用程序的基础。这些新的基类提供了支持众多新用户界面功能(如功能区、可停靠、可调整大小的窗口窗格、以及工作区持久性等)所需的全部要素。13.4.2 最小功能包应用程序

本小节的代码显示了可支持功能区栏的最小应用程序对象。程序的应用程序类CMinApp由CWinAppEx派生而来,可实现大家所熟悉的InitInstance成员函数(通常用于创建应用程序的主窗口)。千万不要忘记调用SetRegistryKey成员函数来设置应用程序的注册表位置,因为新的架构类都要依赖于它。然后,InitInstance继续以通常的方式创建主窗口。

似2.4.2中的最小MFC程序,需先创建一个名为Min的“Visual C++/Win32”的“Win32项目”,在其“应用程序设置”页中的“附加选项”栏中,选中“空项目”。并修改项目属性

中的“配置属性/常规”页中的“项目默认值”栏的“MFC的使用”为“在静态库中使用MFC”或“在共享DLL中使用MFC”。然后将下面的最小VC08 MFC功能包应用程序的具体代码之CPP文件添加到该项目中(运行结果如图13-18所示):

// Min.cpp

#include

#include

#include

class CMainWindow : public CFrameWndEx {

public:

CMainWindow();

}

CMainWindow::CMainWindow() {

Create(NULL, //class name

L"Minimum Feature Pack CMyApp"); //window name }

class CMinApp : public CWinAppEx {

public:

virtual BOOL InitInstance();

};

BOOL CMinApp::InitInstance() {

SetRegistryKey(L"SYSU\\MinSample");

// 此处不能直接使用CFrameWndEx类的(保护型)默认构造函数

m_pMainWnd = new CMainWindow;

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

CMinApp theApp;

图13-18 最小功能包应用程序例

13.4.3 Office功能区用户界面

利用MFC的功能包,我们可以非常轻松地向MFC框架窗口,添加与Microsoft Office 2007系统功能区元素类似的功能区栏。

从概念上讲,功能区(ribbon)由多个被称为类别(category)的选项卡(tab)组成,每个选项卡都承载着一组面板(panel)。反过来,这些面板又承载着功能区元素或控件,它们分别代表特定于应用程序的各种操作。如果功能区承载着应用程序按钮(左上角的大圆按钮),则在用户单击应用程序按钮时所显示的弹出窗口中也会显示一个面板,它被视为功能区的主类别。

CMFCRibbonBar类可实现功能区栏本身,而CMFCRibbonCMyAppButton类则代表功能区栏所承载且显示在窗口框架左上角的应用程序按钮。功能区栏通常是在WM_CREATE 消息处理程序中创建和准备的。要创建功能区栏,只需调用CMFCRibbonBar的Create成员函数,以提供将其附加到其中的窗口框架的地址即可,然后根据需要填充它。AddMainCategory成员函数将主类别添加到功能区,并返回一个指向CMFCRibbonMainPanel 的指针,你可以利用它向其中添加将要显示在此面板中的功能区元素。

通过调用AddCategory成员函数,可向其中添加更多的类别来表示功能区的选项卡。AddCategory返回一个指向CMFCRibbonCategory对象(你可使用其AddPanel成员函数向其中添加面板)的指针。AddPanel返回一个指向CMFCRibbonPanel对象(可像使用功能区的主面板一样向其中添加功能区元素)的指针。最后,你可使用CMFCVisualManager:: SetDefaultManager静态成员函数来设置负责处理框架窗口的样式和外观的可视化管理器。图13-19显示了功能区应用程序的可能外观,假定你已为功能区栏上的按钮添加了必要的事件处理程序。

图13-19 功能区应用程序

下面的代码显示了具有功能区栏和应用程序按钮的一个最小SDI框架窗口。其中的应用程序按钮并不是必需的,但通常会与功能区栏结合使用,为应用程序提供各种各样的主菜单,以代替传统的“文件”菜单。

class CMainWindow : public CFrameWndEx {

DECLARE_MESSAGE_MAP()

public:

CMainWindow();

int OnCreate(CREATESTRUCT* createStruct);

CMFCRibbonBar m_ribbon;

CMFCRibbonCMyAppButton m_appButton;

};

BEGIN_MESSAGE_MAP(CMainWindow, CFrameWndEx)

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.Create(this)) return -1;

m_appButton.SetImage(IDB_APP_BUTTON);

m_ribbon.SetCMyAppButton(&m_appButton, CSize(45, 45));

相关文档