13MFC功能包编程简介(windows编程技术)

上传人:沈*** 文档编号:191479375 上传时间:2023-03-03 格式:PDF 页数:46 大小:2.41MB
收藏 版权申诉 举报 下载
13MFC功能包编程简介(windows编程技术)_第1页
第1页 / 共46页
13MFC功能包编程简介(windows编程技术)_第2页
第2页 / 共46页
13MFC功能包编程简介(windows编程技术)_第3页
第3页 / 共46页
资源描述:

《13MFC功能包编程简介(windows编程技术)》由会员分享,可在线阅读,更多相关《13MFC功能包编程简介(windows编程技术)(46页珍藏版)》请在装配图网上搜索。

1、1 第 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)等等。程序员可

2、以利用该功能包编写具有类似于微软公司新版的Microsoft Office、Visual Studio 或 Internet Explorer 等流行界面视觉样式的应用程序。MFC 功能包的改进主要体现在新型用户界面上,主要包括:功能区(ribbon)、选项卡(tab)窗口和窗格(pane)、视觉样式切换(换肤)、可停靠与自动隐藏的控制条和窗格等。MFC 功能包的帮助信息,位于 MSDN 的“目录 开发工具和语言Visual Studio 文档 Visual 参考信息 Libraries ReferenceMFC Feature Pack for Visual C+2008”,主要内容在其“R

3、eferenceClasses”子目录中。在 VS2010 中,MFC 功能包已被完全并入MFC,所以其帮助系统也被并入标准的MFC帮助系统之中,位于MSDN 的“目录 开发工具和语言Visual Studio 文档参考信息Libraries ReferenceMFC”,主要内容也在其“Classes”子目录中。13.1 新增功能MFC 功能包在用户界面方面增加了许多新功能,包括对传统界面元素的改进和若干新增的界面元素。13.1.1 传统界面元素的改进MFC 功能包,对菜单、工具条、对话框和控件等传统界面元素,进行了大量改进,以适应时髦用户界面的需要。1菜单在功能包中增了微软Office 新样

4、式的菜单和菜单条,可以停靠和用(自绘)图片定制,2 支持菜单阴影和滚动、菜单工具提示、运行时的菜单字体修改、菜单标识的自绘、最近使用列表和窗口列表、右对齐的组合框、可去掉的菜单(tear-off menus)等,还支持菜单动画,包括图片淡入和渐显、展开或滑进视图等。2工具条功能包中的新型工具条,支持大图标和双臂章式(double-chevron)按钮(存在比当前可见部分更多的按钮),而且按钮的图片可在鼠标悬浮于按钮上时更换,并允许在图片下显示文本,还可以在菜单和工具提示中自动创建键盘快捷键。在新型工具条中,可包含钢筋(Rebar)子窗口容器、标准的组合框和文本框按钮、标准字体组合框和字体大小组

5、合框按钮、标准颜色选择器控件,以及包含钉销钮的下拉式可移去窗格,还支持MS Office 视觉样式(visual styles)和具有背景图的透明工具条。不可定制的工具条。3控件功能包中新增和改进的控件有:URL链接钮、装饰有位图图片的按钮、菜单钮、可编辑列表、颜色选择器控件、壳(Shell)树控件、壳列表控件、屏蔽的(Masked)编辑控件、定制的(Custom)工具提示控件、包含浏览钮的编辑控件、属性格(Property grid)、MDI选项卡(tab)控件、支持诸如三维、Excel、OneNote 等视觉样式的选项卡控件。4对话框功能包中新增和改进的对话框有:Windows 管理器对话

6、框、Office 样式的颜色选择对话框、图片编辑器对话框、包含若干控件(诸如快捷条、树控件或Office 2007 样式列表等)的属性单(property sheets)。13.1.2 新界面元素MFC 功能包新增加的界面元素主要有窗格、功能区和选项卡。1窗格窗格(Panes)是一种窗口,通常是可调整大小、可移去和可停靠的。窗格支持如下功能:MS Office 样式的对话框条、(支持图片和停靠的)Office 样式的菜单条,MS Outlook3 样式的快捷条(shortcut bar)、标题条(caption bar)和任务窗格(task pane),(类似于工具条、属性和浏览器窗格)Vis

7、ual Studio 样式的窗格。窗格还支持(内容和位置在应用程序的多次运行之间持续不变的)钢筋(Rebar)控件、(支持图标、动画和进度条)状态条和打印预览服务。2功能区控件功能区(ribbon,缎丝带/带状条)是新的Microsoft Office Fluent用户界面的一部分,用来代替传统的菜单和工具条功能。在面板设计器中,功能区包含一些用于创建、编辑和导出面板及其元素的上下文工具。功能区控件支持:通用功能区特性(features)、Vista Aero 集成(默认样式为气体主题theme)、功能区窗格、功能区上下文的类别(categories)选项卡标签)、功能区元素、功能区键提示(k

8、eytips)、功能区调色板(图表种类galleries)、功能区用户化定制、功能区最小工具条、功能区启动(Launch)按钮和主按钮、功能区状态条等。3选项卡窗口在 MFC 功能包的MDI 应用程序中,不再使用传统的多个独立子窗口作为文档窗口,而是使用位于主框架窗口客户区的MDI 选项卡窗口(tabbed window)组,简称为选项卡组(tabbed groups)。选项卡窗口可被垂直或水平排列,如果一个应用程序具有多个MDI 选项卡组,则各组之间用分隔条(splitter)分开。MDI选项卡组具有如下特点:应用程序可动态创建选项卡窗口、应用程序可垂直或水平排列选项卡窗口、选项卡窗口组被分

9、隔条分开、用户可使用分隔条来调整选项卡组的大小、用户可在组间拖动单个选项卡、用户可拖动单个选项卡来创建组、用户可使用快捷菜单来移动选项卡或创建新组、应用程序可以保存和装入选项卡窗口的布局和MDI 文档列表、应用程序还可以访问单个选项卡组并修改它们的参数。13.1.3 新增功能MFC 功能包新增加的其他功能有Outlook 式的桌面报警、控件的定制、可视化管理和若干特殊的功能和操作。4 1桌面报警微软的 Outlook 式桌面报警(Desktop Alert),显示一个包含通知的弹出窗口,如 Outlook收件箱中的通知邮件到达消息的窗口。2定制用户可自定义控件的颜色、图片和文本等,包括:位于工

10、具条和菜单之间的拖拉钮(drag button)、使用简单的位图编辑器来编辑用户定义的图片、在运行时创建自定义的工具条、定制上下文菜单、使用工具条定制菜单来快速定制工具条按钮、使用菜单资源来自动创建用户化类别(customization categories)、利用按下Alt 键并拖曳工具条按钮来定制工具条、定制鼠标事件处理、定制快捷键、保存和恢复工具条与菜单的状态到注册表、访问工作区(workspace)管理器以保持定制的设置到注册表、调用自定义工具等。3可视化MFC 提供了可视化(visualization)管理器,它按照用户选择的视觉样式来绘制控件。可视化支持Microsoft Offi

11、ce 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)。灵巧

12、(Smart)在拖动窗口期间画窗口的内容而且有一箭头标记指出窗口可停靠的位置(如Microsoft Visual Studio 2005/2008)。5 13.2 界面的切换与定制与传统的 MFC 应用程序不同,功能包应用程序可以在运行时由用户来动态切换界面风格和定制菜单与工具条等界面元素。下面我们通过一个简单的例子,展示一下MFC 功能包应用程序界面的视觉样式及主题的切换效果和强大的用户自定义功能。13.2.1 视觉样式切换创建一个单文档界面的MFC 应用程序FP1:在“MFC 应用程序向导”对话框的“应用程序类型”页(参见图13-1),选中“应用程序类型”栏的“单个文档”单选项、选中“项目

13、类型”栏的“MFC 标准”单选项,其它保持不变(如“视觉样式和颜色”栏的下拉式列表中为“Visual Studio 2005”选项、“启用视觉样式切换”复选框是选中的),按“完成”钮生成 FP1 项目。直接编译运行的结果如图13-2 所示。图 13-1 在 MFC 应用程序向导中启用视觉样式切换6 图 13-2 Visual Studio 2005 视觉样式在应用程序的“视图”菜单中有一个“应用程序外观”子菜单,其中包含如下菜单项:Windows 2000、Office XP、Windows XP、Office 2003、Visual Studio.NET 2005(默认值)、Office 2

14、007(蓝色样式、黑色样式、银色样式、水绿色样式),参见图13-3。图 13-3 应用程序外观菜单默认的视觉样式为我们在在“MFC 应用程序向导”对话框的“应用程序类型”页“视觉样式和颜色”栏的下拉式列表中所选中的选项(Visual Studio 2005)。图 13-4 是若干其它视觉样式的效果图:Windows XP Office 2003 7 Office 2007 的蓝色样式Office 2007 的黑色样式图 13-4 部分视觉样式13.2.2 自定义设置在程序的“视图”菜单的“工具栏和停靠窗口”子菜单中,还有一个“自定义”菜单项,利用其弹出的对话框,用户可以在程序运行时进行许多自定

15、义设置(似MS Word 2003),图13-5 是“自定义”对话框的若干设置页。“命令”页“工具栏”页“键盘”页“菜单”页8“选项”页图 13-5“自定义”对话框的若干设置页1增删工具栏按钮可以按工具栏右端的工具栏选项钮,利用弹出的“添加或删除按钮”子菜单中的“标准”子菜单,来增/删(显示/隐藏)标准工具栏中的按钮,参见图13-6。图 13-6“添加或删除按钮”菜单中的“标准”子菜单利用工具栏选项的“添加或删除按钮”子菜单中的“自定义”菜单项(或利用程序“视图”菜单的“工具栏和停靠窗口”子菜单中的“自定义”菜单项)弹出的“自定义”对话框的“命令”页,还可以使用各菜单中的菜单项来可视化地交互增

16、删、分组、调位工具栏上的按钮(或菜单项)(似 MS Office 和 MS Visual Studio)。2新建工具栏利用“自定义”对话框的“工具栏”页(参见图13-7),可以在运行时为应用程序动态9 创建新的工具栏,并在其中增加若干(菜单项或)按钮。具体的做法是:图 13-7“自定义”对话框的“工具栏”页在对话框中按“新建”钮,在弹出的“工具栏名称”对话框中输入新工具栏的名称,如“编辑”,按“确定”关闭此对话框,参见图13-8。图 13-8“工具栏名称”对话框利用“自定义”对话框的“命令”页,向出现的浮动空工具栏中添加若干菜单项按钮,如“编辑”菜单中的“剪切”、“复制”和“粘贴”菜单项按钮:

17、。可以将新加的工具栏停靠到自己喜欢的位置,如标准工具栏之下,参见图13-9。图 13-9 停靠新工具栏到标准工具栏下10 3设置快捷键利用“自定义”对话框的“键盘”页,可以在运行时为应用程序动态添加菜单项对应的快捷键。具体做法是,在对话框中左上部的“类别”栏的下拉式列表中选择一菜单(如“文件”),在其下的“命令”栏的列表中选择一菜单项(如“打印预览”),定位于对话框中下部的“按新快捷键”栏下的文本编辑框,按快捷键组合键(如Ctrl+R),再按对话框的“分配”钮完成操作,参见图13-10。图 13-10 利用“自定义”对话框的“键盘”页设置快捷键如果你选择的组合键已经被分配给了本程序的其它菜单项

18、(此时在该文本编辑框下面的“已分配给:”之下,会显示此组合键所原来所对应的菜单项名串),则“分配”钮是灰色不可用的。另外,按对话框的“删除”钮,可以删除当前菜单项的已有快捷键。按对话框的“全部重置”钮,可以恢复初始的快捷键设置(你在程序运行后所作的快捷键设置将全部作废)。4切换菜单利用“自定义”对话框的“菜单”页左边的“应用程序框架菜单”栏的“显示菜单”下拉式列表,可以在框架窗口的多个菜单中进行强制切换,参见图13-11。11 图 13-11 利用“自定义”对话框的“菜单”页切换菜单例如,对多文档界面的应用程序,可以在未打开子窗口时的(含3 个下拉菜单的)“默认菜单”和打开子窗口后的(含 5

19、个下拉菜单的)与应用程序项目同名的菜单之间进行强制切换。5编辑上下文菜单利用“自定义”对话框的“菜单”页右边的“上下文菜单”栏的“选择上下文菜单”下拉式列表,可以在选择已有的上下文菜单(如“编辑”)后,再切换到“命令”页,然后就可以通过鼠标交互式可视操作来编辑该上下文菜单,包括增加、删除、移位、分组菜单项等。参见下图13-12。a)初始的“编辑”上下文菜单12 b)将文件菜单中的打开等菜单项拖进“编辑”上下文菜单图 13-12 利用“自定义”对话框的“菜单”页编辑上下文菜单6工具栏和菜单选项利用“自定义”对话框的“选项”页(参见图13-13)上部的“工具栏”,可以选择是否“在工具栏上显示屏幕提

20、示”(即鼠标悬浮时的tip),以及是否“在屏幕提示中显示快捷键”,它们的区别如:或。还可以在“选项”页中选择工具栏是否使用“大图标”(参见图 13-13)。图 13-13“自定义”对话框的“选项”页与设置工具条上的图标大小利用“选项”页下部的“个性化菜单和工具栏”,选择是否“菜单首先显示最近使用的命令”,以及是否在“短暂延迟后显示完整菜单”,参见图13-14。13(a)首先显示最近使用的菜单项(b)短暂延迟后显示完整菜单(c)直接显示完整菜单图 13-14 是否显示完整菜单13.3 窗口框架MFC 功能包引入了全新的窗口框架,支持窗口停靠、控制条窗格、停靠站条、窗格容器、窗格分隔条、自动隐藏控

21、制条、选项卡控制条和 Outlook 控制条等。13.3.1 窗口停靠MFC功 能 包 引 入 了 类 似 于Visual Studio界 面 的 窗 口 停 靠(docking)功能。应用程序的主框架窗口通常由CFrameWndEx或CMDIFrameWndEx类表示,主框架也被称为停靠站(dock site)。13.3.2 控制条窗格在 MFC 功能包中,控制条被称为窗格(pane),是从 CBasePane类派生的。而传统控制条基类为CControlBar,参见图 13-15(其中带星号的为功能包新增类)。窗格的父窗口可为以下三种类型之一:停靠站、停靠条、或袖珍框架窗口,参见图13-16

22、。图 13-15 控制条窗格类14 图 13-16 MFC 功能包创建的应用程序有两类窗格:大小不可调的及大小可调的。大小可调的窗格(如状态条和工具条)可以使用分隔条(splitter)或滑条(slider)来调整大小。大小可调的窗格可构成容器,即一个窗格中可停靠若干其他窗格,在它们之间用分隔条分开。但是,大小可调的窗格不能被粘接(停靠)到停靠条。大小不可调的窗格从CPane类派生,而大小可调的窗格则从CDockablePane类派生。13.3.3 停靠站在应用程序中,停靠站(dock site)(即主框架窗口)拥有所有的窗格和袖珍框架窗口。停靠站包含一个CDockingManager成员,该

23、成员维护着属于此停靠站的所有窗格的一个列表。该列表是排好序的,使得在外部边界上创建的窗格,被放在列表的开始处。在架构(framework)重绘停靠站时,它会遍历该列表,调整其中每个窗格的布局,以放入停靠站的 当 前 矩 形 范 围 中。在 你 需 要 调 整 停 靠 布 局 时,可 以 调 用AdjustDockingLayout或RecalcLayout 函数,架构会重定向这一调用到停靠管理器。13.3.4 停靠条每个主框架窗口都可以沿其边框放置停靠条。停靠条(dock bar)是一个属于CDockSite类的窗格。停靠条可以接受派生于CPane 的对象,如工具条。在主框架窗口初始化时,调用

24、(CBasePane 类的)EnableDocking函数来创建停靠条、调用(CDockablePane 类的)15 EnableAutoHideBars 函数来激活自动隐藏条。EnableAutoHideBars 创建 CAutoHideDockSite对象,并放置它们紧邻每个停靠条。每个停靠条被分成若干停靠行(dock row),停靠行由CDockingPanesRow 类表示。每个停靠行包含一个工具条列表。如果用户停靠一个工具条或将工具条从一个停靠行移动到同一停靠条的另一个停靠行时,架构会或者创建一个新的停靠行并相应地调整停靠条的大小;或者放置该工具条到一个已存在的停靠行上。13.3.5

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

26、splitters),由CPaneDivider类表示。在用户停靠窗格时,架构会创建窗格分隔条,不管该窗格是停靠在停靠站还是另一个窗格之中。当窗格停靠到停靠站时,窗格分隔条会调用默认的窗格分隔条。默认窗格分隔条,负责所有停靠进停靠站的窗格的排列布局。停靠管理器维护着一个默认窗格分隔条的列表和一个窗格的列表。停靠管理器负责所有停靠窗格的排列布局。13.3.7 窗格容器所有大小可变的窗格,在相互停靠时,都被维护在由CPaneContainer 类表示的容器(container)中。每个容器都具有若干指针,分别指向左窗格、右窗格、左子容器、右子容器、和左右部分之间的分隔条,其中的左和右不是指物理上的

27、边侧,而是标识树结构的分支。用这种方式,我们可以建造一棵窗格和分隔条的树,从而可达成复杂的窗格布局,改变窗格大小以使它们合在一起。CPaneContainer 类维护容器树,它也维护位于此树中的两个窗格和分隔条列表。窗格容器管理器,通常被植入带有多个窗格的默认滑条和袖珍框架窗口之中。16 13.3.8 自动隐藏控制条在默认情况下,每个CDockablePane 都支持自动隐藏特性(auto-hide feature)。当用户单击 CDockablePane 标题上的钉栓(pin)钮时,架构会切换窗格到自动隐藏模式。为了处理单击,架构会创建一个CMFCAutoHideBar类和一个CMFCAut

28、oHideButton类以及CMFCAutoHideBar对象。架构将新的CMFCAutoHideBar放到 CAutoHideDockSite中。架构还将 CMFCAutoHideButton附加到工具条。CDockingManager 类维护 CDockablePane。13.3.9 选项卡控制条与 Outlook 条CMFCBaseTabCtrl 类,实现具有可分标签(tab)选项卡(tabbed)窗口的基本功能。为了使用CMFCBaseTabCtrl对象,需在你的应用程序中初始化CBaseTabbedPane 类。CBaseTabbedPane派生于 CDockablePane,维护着

29、一个指向CMFCBaseTabCtrl 对象的指针。CBaseTabbedPane使用户能够停靠和调整选项卡控制条(tabbed control bar)的大小。可使用CDockablePane:AttachToTabWnd 函数,来动态创建被停靠和标注(tabbed)的控制条。Outlook(景色)条(bar)控件也是基于选项卡条的,对应的类CMFCOutlookBar也派生于 CBaseTabbedPane。Outlook 条是一种选项卡窗格(tabbed pane),具有 Microsoft Outlook 2000 或 Outlook 2003 中的导航窗格(Navigation Pa

30、ne)的可视外观。CMFCOutlookBar对象包含一个CMFCOutlookBarTabCtrl类的对象和一系列选项卡。选项卡(tab)可以是一个CMFCOutlookBarPane 类对象,或是一个CWnd 派生类的对象。对用户来说,Outlook 条表现为一系列按钮和一个显示区域,当用户单击一个按钮时,对应的控件或窗格就被显示出来。13.4 应用程序架构MFC 功能包增加了与传统的应用程序框架基类相对应的扩展类,我们可以利用这些类的手工编码来创建多种具有功能包新界面的MFC 应用程序。13.4.1 类层次结构传统的 MFC 应用程序的架构类(参见图13-17 下部),都是从MFC 类库

31、中的对应基类(参见图13-17 上部)派生的,可参见12.2 节。为了能支持新图形用户界面,VC08 的 MFC 功能包增加了这些基类的扩展版(参见图17 13-17 中部),如应用程序类C*App 的基类是从CWindApp 派生的 CWindAppEx 类、单文档应用程序的主框架窗口类CMainFrame 的基类是从CFrameWnd 派生的 CFrameWndEx 类、多 文 档 应 用 程 序 的 主 框 架 窗 口 类CMainFrame的 基 类 是 从CMDIFrameWnd派 生 的CMDIFrameWndEx类、多 文 档 应 用 程 序 的 子 框 架 窗 口 类CChil

32、dFrame的 基 类 是 从CMDIChildWnd派生的 CMDIChildWndEx类。文档类和文档模板类则没有变化。图 13-17 MFC 应用程序项目(Test)中的主要类及其基类许多新功能都依赖于新版本扩展类CWinAppEx、CFrameWndEx 和 CMDIFrameWndEx,这些类代表着大多数MFC 应用程序的基础。这些新的基类提供了支持众多新用户界面功能(如功能区、可停靠、可调整大小的窗口窗格、以及工作区持久性等)所需的全部要素。13.4.2 最小功能包应用程序本小节的代码显示了可支持功能区栏的最小应用程序对象。程序的应用程序类CMinApp 由 CWinAppEx派生

33、而来,可实现大家所熟悉的InitInstance 成员函数(通常用于创建应用程序的主窗口)。千万不要忘记调用SetRegistryKey 成员函数来设置应用程序的注册表位置,因为新的架构类都要依赖于它。然后,InitInstance 继续以通常的方式创建主窗口。似 2.4.2 中的最小 MFC 程序,需先创建一个名为Min 的“Visual C+/Win32”的“Win32项目”,在其“应用程序设置”页中的“附加选项”栏中,选中“空项目”。并修改项目属性CObject CCmdTarget CWnd CWinTread CWinApp CFrameWnd CView CScrollView C

34、DocTemplate CDocument CSingleDocTemplate CMultiDocTemplate CTestApp CMainFrame CTestView CChildFrame CTestDoc 传统 MFC 类你的应用程序类CWinAppEx CFrameWndEx CMDIFrameWnd CMDIChildWnd CMDIFrameWndEx CMDIChildWndEx MFC 功能包扩展类18 中的“配置属性/常规”页中的“项目默认值”栏的“MFC的使用”为“在静态库中使用MFC”或“在共享DLL 中使用 MFC”。然后将下面的最小VC08 MFC 功能包应用

35、程序的具体代码之 CPP 文件添加到该项目中(运行结果如图13-18 所示):/Min.cpp#include#include#include class CMainWindow:public CFrameWndEx public:CMainWindow();CMainWindow:CMainWindow()Create(NULL,/class name LMinimum Feature Pack CMyApp);/window name class CMinApp:public CWinAppEx public:virtual BOOL InitInstance();BOOL CMinApp

36、:InitInstance()SetRegistryKey(LSYSUMinSample);/此处不能直接使用CFrameWndEx类的(保护型)默认构造函数m_pMainWnd=new CMainWindow;m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;CMinApp theApp;19 图 13-18 最小功能包应用程序例13.4.3 Office功能区用户界面利用 MFC 的功能包,我们可以非常轻松地向MFC 框架窗口,添加与Microsoft Office 2007 系统功能区元素类似的

37、功能区栏。从概念上讲,功能区(ribbon)由多个被称为类别(category)的选项卡(tab)组成,每个选项卡都承载着一组面板(panel)。反过来,这些面板又承载着功能区元素或控件,它们分别代表特定于应用程序的各种操作。如果功能区承载着应用程序按钮(左上角的大圆按钮),则在用户单击应用程序按钮时所显示的弹出窗口中也会显示一个面板,它被视为功能区的主类别。CMFCRibbonBar类可实现功能区栏本身,而CMFCRibbonCMyAppButton类则代表功能区栏所承载且显示在窗口框架左上角的应用程序按钮。功能区栏通常是在WM_CREATE消息处理程序中创建和准备的。要创建功能区栏,只需调

38、用CMFCRibbonBar 的 Create成员函 数,以 提 供 将 其 附 加 到 其 中 的 窗 口 框 架 的 地 址 即 可,然 后 根 据 需 要 填 充 它。AddMainCategory 成员函数将主类别添加到功能区,并返回一个指向CMFCRibbonMainPanel的指针,你可以利用它向其中添加将要显示在此面板中的功能区元素。通过调用AddCategory成员函数,可向其中添加更多的类别来表示功能区的选项卡。AddCategory 返回一个指向CMFCRibbonCategory 对象(你可使用其AddPanel 成员函数向其中添加面板)的指针。AddPanel 返回一个

39、指向CMFCRibbonPanel 对象(可像使用功能区的主面板一样向其中添加功能区元素)的指针。最后,你可使用CMFCVisualManager:SetDefaultManager 静态成员函数来设置负责处理框架窗口的样式和外观的可视化管理器。图 13-19 显示了功能区应用程序的可能外观,假定你已为功能区栏上的按钮添加了必要的事件处理程序。20 图 13-19 功能区应用程序下面的代码显示了具有功能区栏和应用程序按钮的一个最小SDI 框架窗口。其中的应用程序按钮并不是必需的,但通常会与功能区栏结合使用,为应用程序提供各种各样的主菜单,以代替传统的“文件”菜单。class CMainWind

40、ow: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*/,LMFC Ribbon Sampl

41、e 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);21 CMFCRibbonMainPanel*appButtonMenu=m_ribbon.AddMainCat

42、egory(LMenu,IDB_APP_BUTTON_MENU_SMALL,IDB_APP_BUTTON_MENU_LARGE);appButtonMenu-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 appButtonMenu-AddToBottom(new CM

43、FCRibbonMainPanelButton(ID_APP_EXIT,LE&xit,15/*small image index*/);CMFCRibbonCategory*category=m_ribbon.AddCategory(LHome,IDB_RIBBON_CAT_HOME_SMALL,IDB_RIBBON_CAT_HOME_LARGE);CMFCRibbonPanel*panel=category-AddPanel(LClipboard);panel-Add(new CMFCRibbonButton(ID_EDIT_PASTE,LPaste,0,/small image index

44、 0);/large image index panel-Add(new CMFCRibbonButton(ID_EDIT_CUT,LCut,1);panel-Add(new CMFCRibbonButton(ID_EDIT_COPY,LCopy,2);panel-Add(new CMFCRibbonButton(ID_EDIT_SELECT_ALL,LSelect All,-1);m_ribbon.AddCategory(LInsert,IDB_RIBBON_CAT_HOME_SMALL,IDB_RIBBON_CAT_HOME_LARGE);22 CMFCVisualManager:SetD

45、efaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007);CMFCVisualManagerOffice2007:SetStyle (CMFCVisualManagerOffice2007:Office2007_LunaBlue);return 0;13.4.4 选项卡式多文档界面MFC 一直都支持MDI 实现及其文档/视图体系结构,但图13-20 a)中所示的传统MDI早已过时,用户可能会认为你的应用程序从Windows 95 开始就再也没有更新过。现在,绝大 多 数 用 户 都 期 望 可 通 过 窗 口 边 缘 的 选 项 卡 来

46、访 问 多 个 文 档,而 这 正 是 新 的CMDIFrameWndEx MDI框架窗口所提供的功能,参见图13-20 b)。a)传统 MDI b)选项卡式 MDI 图 13-20 多文档界面的MFC 应用程序我们需要更新多文档/视图应用程序对象以支持新的框架窗口。下面的代码显示了满足需要的最小选项卡式MDI 应用程序对象。class CMyApp:public CWinAppEx DECLARE_MESSAGE_MAP()public:virtual BOOL InitInstance();BEGIN_MESSAGE_MAP(CMyApp,CWinAppEx)ON_COMMAND(ID_F

47、ILE_NEW,&CWinAppEx:OnFileNew)23 END_MESSAGE_MAP()BOOL CMyApp:InitInstance()SetRegistryKey(LSampleCompanySampleProduct);VERIFY(InitContextMenuManager();AddDocTemplate(new CMultiDocTemplate(IDR_CHILDFRAME,RUNTIME_CLASS(Document),RUNTIME_CLASS(CMDIChildWndEx),RUNTIME_CLASS(View);CMainWindow*mainWindow=

48、new CMainWindow();VERIFY(mainWindow-LoadFrame(IDR_MAINFRAME);m_pMainWnd=mainWindow;m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;它类似于传统的MDI 应用程序对象,但有几点值得一提。首先,子窗口框架的运行时类是 CMDIChildWndEx,而非传统的CMDIChildWnd类。要准备在选项卡式视图之间进行切换时使用的菜单管理器,还需调用InitContextMenuManager 函数。下面的代码显示了最小选项卡

49、式MDI 框架窗口。同样,你会看到开启此功能是多么地简单。实际只需调用EnableMDITabbedGroups 成员函数来启用MDI 选项卡式分组功能即可。CMDITabInfo 类提供了各种成员变量,可使用它们来自定义选项卡式分组的外观和行为。顾名思义,它甚至还允许用户拖动不同的视图来创建垂直或水平对齐的选项卡组。class CMainWindow:public CMDIFrameWndEx DECLARE_DYNCREATE(CMainWindow)DECLARE_MESSAGE_MAP()private:int OnCreate(CREATESTRUCT*createStruct);I

50、MPLEMENT_DYNCREATE(CMainWindow,CMDIFrameWndEx)BEGIN_MESSAGE_MAP(CMainWindow,CMDIFrameWndEx)24 ON_WM_CREATE()END_MESSAGE_MAP()int CMainWindow:OnCreate(CREATESTRUCT*createStruct)if(-1=_super:OnCreate(createStruct)return-1;CMDITabInfo tabInfo;tabInfo.m_bAutoColor=true;tabInfo.m_bDocumentMenu=true;Enabl

51、eMDITabbedGroups(true,tabInfo);return 0;13.5 编写功能区应用程序功能区(ribbon)用于代替传统的菜单和工具条,是微软公司推崇的新图形界面。MFC功能包提供了对功能区界面的支持,但是却没有提供功能区资源的交互式设计界面。即将推出的 Visual C+2010(MFC 10.0)可弥补这一缺陷。13.5.1 MFC 功能包手工编程下面通过一个简单的例子,来介绍如何用MFC 功能包来创建一个新的功能区应用程序,并在程序中手工添加自己的界面元素和代码。此节所对应的英文帮助文档,位于VS08SP1 的 MSDN 帮助系统的“目录/开发工具和语言/Visua

52、l Studio/Visual C+/参考信息/Libraries Reference/MFC Feature Pack for Visual C+2008/Walkthroughs/Walkthrough:Create a New Ribbon Application By Using MFC”之中。1创建功能区应用程序项目选“文件 新建 项目”菜单项、或按“Ctrl+Shift+N”组合键、或选“起始页创建 项目”选项。在弹出的“新建项目”对话框中,在左边的“项目类型”栏中选“Visual C+MFC”项,在右边的“模版”栏中选“MFC 应用程序”项,在下边的“位置”栏选择新项目目录的父目

53、录所在的路径(如),在“名称”栏中键入你的程序项目名(如Rib),不选中“创25 建解决方案的目录”选项,按“确定”钮,参见图13-21。图 13-21 新建项目对话框在弹出的“MFC 应用程序向导”对话框的欢迎页中,按“下一步”按钮或单击左栏中的“应用程序类型”项,进入该对话框的“应用程序类型”页。在“应用程序类型”页右边上部的“项目类型”栏,选中“Office”单选钮(默认是“Visual Studio”)。保持“视觉样式和颜色”栏下拉式列表中的默认“Office 2007(蓝色主题)”条目不变,同时保持“启用视觉样式切换”复选框被选中。该页的其余选项也保持默认设置不变,参见图13-22。

54、图 13-22 选择项目类型和视觉样式单击左栏中的“用户界面功能”项,进入“MFC 应用程序向导”对话框的“用户界面功26 能”页。(重要步骤)在“用户界面功能”页中,保持右边“命令栏”下部的“使用功能区”单选项被选中,参见下图13-23。图 13-23 选择“使用功能区”按“下一步”钮或单击左边的“高级功能”项,进入“高级功能”页。为了简单起见,我们这里去选右边“高级框架窗格”栏中的所有复选框(“导航窗格”和“标题栏”默认是选中的),参见图13-24。图 13-24 去选高级框架窗格选项27 按“完成”钮关闭“MFC 应用程序向导”对话框,向导会自动生成对应的项目。编译运行此项目,结果如图1

55、3-25 所示。图 13-25 功能区 Office 类型的 MFC 功能包应用程序例可见,向导为我们的应用程序自动创建了一个功能区,含有一个功能区类别(ribbon category)选项卡(tab),称为主要(Home)。该功能区(类别)包含三个功能区面板(ribbon panel)分别叫做剪贴板(Clipboard)、视图(View)和窗口(Window)。应用程序(功能区)的其他菜单见图13-26。a)应用程序大图标的(文件)菜单28 b)自定义快速访问工具栏菜单c)样式菜单图 13-25 MFC 功能包应用程序的功能区菜单2添加类别到功能区由项目创建的功能区对象位于CMainFram

56、e 类的头文件MainFrm.h 中:CMFCRibbonBar m_wndRibbonBar;为了向该功能区增加新的类别(category)对象,需要调用CMFCRibbonBar类的成员函数 AddCategory:CMFCRibbonCategory*AddCategory(LPCTSTR lpszName,/类别名,会出现在功能区的标签中UINT uiSmallImagesResID,/小图片资源ID UINT uiLargeImagesResID,/大图片资源ID CSize sizeSmallImage=CSize(16,16)1,/小图片的尺寸,默认为16*16 CSize si

57、zeLargeImage=CSize(32,32)3,/大图片的尺寸,默认为32*32 29 int nInsertAt=-1,/插入位置序号,默认值-1 表示添加到已有功能区类别的后面CRuntimeClass*pRTI=NULL/指向运行类的指针);在 CMainFrame 类的 OnCreate 函数的中部,已有如下两行代码用于创建和初始化功能区对象的:m_wndRibbonBar.Create(this);/创建功能区控件InitializeRibbon();/初始化(定制)功能区在 CMainFrame 类的 InitializeRibbon函数的底部,我们添加如下代码:/添加“定制

58、”类别对象:strTemp.LoadString(IDS_RIBBON_CUSTOM);CMFCRibbonCategory*pCategoryCustom=m_wndRibbonBar.AddCategory(strTemp,IDB_FILESMALL,IDB_FILELARGE);其中,strTemp 为原有的在InitializeRibbon函数起始处定义的局部串变量:CString strTemp;而 CString 类的 LoadString 成员函数:BOOL LoadString(UINT nID);用于装入指定ID 的串资源;IDS_RIBBON_CUSTOM是我们自己在项目的

59、串表(String Table)资源中增加的新类别名串“定制(&C)”的 ID;而 IDB_FILESMALL和 IDB_FILELARGE则为已有的小和大文件图片资源的ID。编译运行修改后的项目,结果是功能区中新增加了(空的)“定制”类别对象,如图 13-26所示。30 图 13-26 添加“定制”类别到功能区3添加面板到类别一个功能区面板(ribbon pane)内含有一组逻辑相关的元素(item)。为了添加功能区面板到功能区类别,你可以使用CMFCRibbonCategory类的 AddPanel method 函数:CMFCRibbonPanel*AddPanel(LPCTSTR lp

60、szPanelName,/面板名HICON hIcon=0,/图标句柄,用于快速访问工具条CRuntimeClass*pRTI=NULL/指向运行类的指针);例如,在 CMainFrame 类的 InitializeRibbon函数的底部,在你刚才的添加功能区类别的代码后,添加如下代码:/创建并添加“喜爱”面板:strTemp.LoadString(IDS_RIBBON_FAVORITES);CMFCRibbonPanel*pPanelFavorites=pCategoryCustom-AddPanel(strTemp,m_PanelImages.ExtractIcon(15);其中,IDS_

61、RIBBON_FA VORITES 是我们自己在项目的串表资源中增加的新面板名串“喜爱”的 ID;m_PanelImages 为项目创建时自动定义的一个CMFCToolBarImages 类对象,已经装入了项目中已有的位图资源IDB_BUTTONS(对应的位图文件为resbuttons.bmp,含有27个图标,参见图13-27)。图 13-27 项目的按钮位图资源(IDB_BUTTONS)参见 InitializeRibbon函数顶部处的代码:/加载面板图像:m_PanelImages.SetImageSize(CSize(16,16);m_PanelImages.Load(IDB_BUTTO

62、NS);而 CMFCToolBarImages 类的 ExtractIcon 成员函数:HICON ExtractIcon(int nIndex);31 的功能是从工具条位图中提取指定序号的图片,并返回对应图标的句柄。编译运行,结果如图13-28 所示。可见,在功能区的“定制”类别选项卡的左边,出现了一个“喜爱”面板。图 13-28 添加“喜爱”面板到“定制”类别4添加元素到面板为了添加元素到上一步所创建的面板里,可以调用CMFCRibbonPanel 类的 Add 方法:virtual void Add(CMFCRibbonBaseElement*pElem);其中的 CMFCRibbonB

63、aseElement 类,是所有能被添加到面板中的元素(如按钮、复选框、和组合框等)的基类。我们首先添加一个“打印”按钮,它将具有一个子菜单,包含一个(使用默认打印机打印的)“快速打印”命令。这两个命令都已经被定义在此应用程序的应用程序大图标的菜单中。在 CMainFrame 类的 InitializeRibbon 函数的底部,在你刚才的添加功能区面板的代码后,添加如下代码:/创建“快速打印”按钮:strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);CMFCRibbonButton*pBtnFavPrintQuick=new CMFCRibbonButton(

64、ID_FILE_PRINT_DIRECT,strTemp,7);其中,ID 为 IDS_RIBBON_PRINT_QUICK的字符串(“打印”)已经被定义在串表资源String Table 中了,对应于ID_FILE_PRINT_DIRECT菜单命令。“快速打印”按钮的图标是ID 为IDB_FILESMALL的位图资源(对应于位图文件resfilesmall.bmp,参见图13-29)中的第832 个(序号为7)。图 13-29 小文件位图资源(IDB_FILESMALL)这里所用的CMFCRibbonButton类的构造函数原型为:CMFCRibbonButton(UINT nID,/按钮所

65、对应的菜单项ID LPCTSTR lpszText,/按钮上的文本串int nSmallImageIndex=-1,/父类别的图像列表中按钮的小图像序号int nLargeImageIndex=-1,/父类别的图像列表中按钮的大图像序号BOOL bAlwaysShowDescription=FALSE/是否始终显示描述串);接着,我们使用CMFCRibbonButton类的 AddSubItem 方法,来添加“快速打印”按钮作为“打印”按钮的子项(subitem)。为此,可在前面所加的创建“打印”按钮的代码后面,再添加如下代码:/创建带有“快速打印”子项的“打印”按钮:strTemp.Load

66、String(IDS_RIBBON_PRINT);CMFCRibbonButton*pBtnFavPrint=new CMFCRibbonButton(ID_FILE_PRINT,strTemp,6);pBtnFavPrint-AddSubItem(pBtnFavPrintQuick);这里的 IDS_RIBBON_PRINT串 ID 也已经被定义在串表中了,对应于 ID_FILE_PRINT菜单项,“打印”的按钮在IDB_FILESMALL位图资源中的图标序号为6。下面的代码将“打印”按钮添加到“喜爱”面板:/添加“打印”按钮到“喜爱”面板:pPanelFavorites-Add(pBtnFavPrint);编译运行的结果如图13-30 所示。可见,功能区的“定制”类别中的“喜爱”面板的顶部出现了一个“打印”按钮,并且该按钮下还有一个“快速打印”子项。33 图 13-30 添加“打印”按钮到“喜爱”面板我们准备添加到“喜爱”面板的第二个元素是一个组合框,为了简单起见,该组合框中的条目不再与任何菜单命令项关联。功能区的组合框类为CMFCRibbonComboBox,其构造函数的原型为:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!