版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第13章 MFC功能包编程简介VS08 SP1所含的VC08的MFC功能包MFC Feature Pack for Visual C+ 2021,在MFC 9.0的根底上增加137个新类及86个内部类和1个新结构。功能包对传统MFC库进行了扩展,以支持时髦的现代用户界面元素,如Office Fluent流畅UI、停靠窗口和MDI选项卡tab窗口似Visual Studio 2005/2021、增强型工具条、丰富的新控件集、支持总体视觉样式overall visual style、支持桌面报警desktop alerts等等。程序员可以利用该功能包编写具有类似于微软公司新版的Microsoft
2、Office、Visual Studio或Internet Explorer等流行界面视觉样式的应用程序。MFC功能包的改良主要表达在新型用户界面上,主要包括:功能区ribbon、选项卡tab窗口和窗格pane、视觉样式切换换肤、可停靠与自动隐藏的控制条和窗格等。MFC功能包的帮助信息,位于MSDN的“目录开发工具和语言Visual Studio文档Visual C+参考信息Libraries ReferenceMFC Feature Pack for Visual C+ 2008”,主要内容在其“ReferenceClasses子目录中。在VS2021中,MFC功能包已被完全并入MFC,所以
3、其帮助系统也被并入标准的MFC帮助系统之中,位于MSDN的“目录开发工具和语言Visual Studio文档Visual C+参考信息Libraries ReferenceMFC,主要内容也在其“Classes子目录中。13.1 新增功能MFC功能包在用户界面方面增加了许多新功能,包括对传统界面元素的改良和假设干新增的界面元素。13.1.1 传统界面元素的改良MFC功能包,对菜单、工具条、对话框和控件等传统界面元素,进行了大量改良,以适应时髦用户界面的需要。1菜单在功能包中增了微软Office新样式的菜单和菜单条,可以停靠和用自绘图片定制,支持菜单阴影和滚动、菜单工具提示、运行时的菜单字体修改
4、、菜单标识的自绘、最近使用列表和窗口列表、右对齐的组合框、可去掉的菜单tear-off menus等,还支持菜单动画,包括图片淡入和渐显、展开或滑进视图等。2工具条功能包中的新型工具条,支持大图标和双臂章式double-chevron按钮存在比当前可见局部更多的按钮,而且按钮的图片可在鼠标悬浮于按钮上时更换,并允许在图片下显示文本,还可以在菜单和工具提示中自动创立键盘快捷键。在新型工具条中,可包含钢筋Rebar子窗口容器、标准的组合框和文本框按钮、标准字体组合框和字体大小组合框按钮、标准颜色选择器控件,以及包含钉销钮的下拉式可移去窗格,还支持MS Office视觉样式visual styles
5、和具有背景图的透明工具条。不可定制的工具条。3控件功能包中新增和改良的控件有:URL链接钮、装饰有位图图片的按钮、菜单钮、可编辑列表、颜色选择器控件、壳Shell树控件、壳列表控件、屏蔽的Masked编辑控件、定制的Custom工具提示控件、包含浏览钮的编辑控件、属性格Property grid、MDI选项卡tab控件、支持诸如三维、Excel、OneNote等视觉样式的选项卡控件。4对话框功能包中新增和改良的对话框有:Windows管理器对话框、Office样式的颜色选择对话框、图片编辑器对话框、包含假设干控件诸如快捷条、树控件或Office 2007样式列表等的属性单property sh
6、eets。13.1.2 新界面元素MFC功能包新增加的界面元素主要有窗格、功能区和选项卡。1窗格窗格Panes是一种窗口,通常是可调整大小、可移去和可停靠的。窗格支持如下功能:MS Office样式的对话框条、支持图片和停靠的Office样式的菜单条,MS Outlook样式的快捷条shortcut bar、标题条caption bar和任务窗格task pane,类似于工具条、属性和浏览器窗格Visual Studio样式的窗格。窗格还支持内容和位置在应用程序的屡次运行之间持续不变的钢筋Rebar控件、支持图标、动画和进度条状态条和打印预览效劳。2功能区控件功能区ribbon,缎丝带/带状条
7、是新的Microsoft Office Fluent用户界面的一局部,用来代替传统的菜单和工具条功能。在面板设计器中,功能区包含一些用于创立、编辑和导出面板及其元素的上下文工具。功能区控件支持:通用功能区特性features、Vista Aero集成默认样式为气体主题theme、功能区窗格、功能区上下文的类别categories选项卡标签、功能区元素、功能区键提示keytips、功能区调色板图表种类galleries、功能区用户化定制、功能区最小工具条、功能区启动Launch按钮和主按钮、功能区状态条等。3选项卡窗口在MFC功能包的MDI应用程序中,不再使用传统的多个独立子窗口作为文档窗口,而
8、是使用位于主框架窗口客户区的MDI选项卡窗口tabbed window组,简称为选项卡组tabbed groups。选项卡窗口可被垂直或水平排列,如果一个应用程序具有多个MDI选项卡组,那么各组之间用分隔条splitter分开。MDI选项卡组具有如下特点:应用程序可动态创立选项卡窗口、应用程序可垂直或水平排列选项卡窗口、选项卡窗口组被分隔条分开、用户可使用分隔条来调整选项卡组的大小、用户可在组间拖动单个选项卡、用户可拖动单个选项卡来创立组、用户可使用快捷菜单来移动选项卡或创立新组、应用程序可以保存和装入选项卡窗口的布局和MDI文档列表、应用程序还可以访问单个选项卡组并修改它们的参数。 新增功能
9、MFC功能包新增加的其他功能有Outlook式的桌面报警、控件的定制、可视化管理和假设干特殊的功能和操作。1桌面报警微软的Outlook式桌面报警Desktop Alert,显示一个包含通知的弹出窗口,如Outlook收件箱中的通知邮件到达消息的窗口。 2定制用户可自定义控件的颜色、图片和文本等,包括:位于工具条和菜单之间的拖拉钮drag button、使用简单的位图编辑器来编辑用户定义的图片、在运行时创立自定义的工具条、定制上下文菜单、使用工具条定制菜单来快速定制工具条按钮、使用菜单资源来自动创立用户化类别customization categories、利用按下Alt键并拖曳工具条按钮来定
10、制工具条、定制鼠标事件处理、定制快捷键、保存和恢复工具条与菜单的状态到注册表、访问工作区workspace管理器以保持定制的设置到注册表、调用自定义工具等。3可视化MFC提供了可视化visualization管理器,它按照用户选择的视觉样式来绘制控件。可视化支持Microsoft Office 2000/XP/2003/2007视觉样式和视觉样式。4特殊功能MFC支持如下操作:自动隐藏窗口、保存和装入已翻开文档的状态、将假设干窗格停靠到浮动的袖珍mini框架窗口、混合图片支持32位图片、按从右到左RTL = Right-To-Left的格式显示全球化文本、允许可达性accessibility支
11、持。MFC还支持运行时改变窗口的停靠类型:标准在拖动窗口期间不画窗口的内容如Microsoft Visual Studio .NET 2003。立即在拖动窗口期间画窗口的内容如Microsoft Visio。灵巧Smart在拖动窗口期间画窗口的内容而且有一箭头标记指出窗口可停靠的位置如Microsoft Visual Studio 2005/2021。13.2 界面的切换与定制与传统的MFC应用程序不同,功能包应用程序可以在运行时由用户来动态切换界面风格和定制菜单与工具条等界面元素。下面我们通过一个简单的例子,展示一下MFC功能包应用程序界面的视觉样式及主题的切换效果和强大的用户自定义功能。
12、视觉样式切换创立一个单文档界面的MFC应用程序FP1:在“MFC应用程序向导对话框的“应用程序类型页参见图13-1,选中“应用程序类型栏的“单个文档单项选择项、选中“工程类型栏的“MFC标准单项选择项,其它保持不变如“视觉样式和颜色栏的下拉式列表中为“Visual Studio 2005”选项、“启用视觉样式切换复选框是选中的,按“完成钮生成FP1工程。直接编译运行的结果如图13-2所示。图13-1 在MFC应用程序向导中启用视觉样式切换图13-2 Visual Studio 2005视觉样式在应用程序的“视图菜单中有一个“应用程序外观子菜单,其中包含如下菜单项:Windows 2000、Of
13、fice XP、Windows XP、Office 2003、Visual Studio.NET 2005默认值、Office 2007蓝色样式、黑色样式、银色样式、水绿色样式,参见图13-3。图13-3 应用程序外观菜单默认的视觉样式为我们在在“MFC应用程序向导对话框的“应用程序类型页“视觉样式和颜色栏的下拉式列表中所选中的选项Visual Studio 2005。图13-4是假设干其它视觉样式的效果图: Windows XPOffice 2003 Office 2007的蓝色样式 Office 2007的黑色样式图13-4 局部视觉样式13 自定义设置在程序的“视图菜单的“工具栏和停靠窗
14、口子菜单中,还有一个“自定义菜单项,利用其弹出的对话框,用户可以在程序运行时进行许多自定义设置似MS Word 2003,图13-5是“自定义对话框的假设干设置页。 “命令页“工具栏页 “键盘页“菜单页“选项页图13-5 “自定义对话框的假设干设置页1增删工具栏按钮可以按工具栏右端的工具栏选项钮,利用弹出的“添加或删除按钮子菜单中的“标准子菜单,来增/删显示/隐藏标准工具栏中的按钮,参见图13-6。图13-6 “添加或删除按钮菜单中的“标准子菜单利用工具栏选项的“添加或删除按钮子菜单中的“自定义菜单项或利用程序“视图菜单的“工具栏和停靠窗口子菜单中的“自定义菜单项弹出的“自定义对话框的“命令页
15、,还可以使用各菜单中的菜单项来可视化地交互增删、分组、调位工具栏上的按钮或菜单项似MS Office和MS Visual Studio。2新建工具栏利用“自定义对话框的“工具栏页参见图13-7,可以在运行时为应用程序动态创立新的工具栏,并在其中增加假设干菜单项或按钮。具体的做法是:图13-7 “自定义对话框的“工具栏页在对话框中按“新建钮,在弹出的“工具栏名称对话框中输入新工具栏的名称,如“编辑,按“确定关闭此对话框,参见图13-8。图13-8 “工具栏名称对话框利用“自定义对话框的“命令页,向出现的浮动空工具栏中添加假设干菜单项按钮,如“编辑菜单中的“剪切、“复制和“粘贴菜单项按钮:。可以将
16、新加的工具栏停靠到自己喜欢的位置,如标准工具栏之下,参见图13-9。图13-9 停靠新工具栏到标准工具栏下3设置快捷键利用“自定义对话框的“键盘页,可以在运行时为应用程序动态添加菜单项对应的快捷键。具体做法是,在对话框中左上部的“类别栏的下拉式列表中选择一菜单如“文件,在其下的“命令栏的列表中选择一菜单项如“打印预览,定位于对话框中下部的“按新快捷键栏下的文本编辑框,按快捷键组合键如Ctrl+R,再按对话框的“分配钮完成操作,参见图13-10。图13-10 利用“自定义对话框的“键盘页设置快捷键如果你选择的组合键已经被分配给了本程序的其它菜单项此时在该文本编辑框下面的“已分配给:之下,会显示此
17、组合键所原来所对应的菜单项名串,那么“分配钮是灰色不可用的。另外,按对话框的“删除钮,可以删除当前菜单项的已有快捷键。按对话框的“全部重置钮,可以恢复初始的快捷键设置你在程序运行后所作的快捷键设置将全部作废。4切换菜单利用“自定义对话框的“菜单页左边的“应用程序框架菜单栏的“显示菜单下拉式列表,可以在框架窗口的多个菜单中进行强制切换,参见图13-11。图13-11 利用“自定义对话框的“菜单页切换菜单例如,对多文档界面的应用程序,可以在未翻开子窗口时的含3个下拉菜单的“默认菜单和翻开子窗口后的含5个下拉菜单的与应用程序工程同名的菜单之间进行强制切换。5编辑上下文菜单利用“自定义对话框的“菜单页
18、右边的“上下文菜单栏的“选择上下文菜单下拉式列表,可以在选择已有的上下文菜单如“编辑后,再切换到“命令页,然后就可以通过鼠标交互式可视操作来编辑该上下文菜单,包括增加、删除、移位、分组菜单项等。参见下列图13-12。a) 初始的“编辑上下文菜单b) 将文件菜单中的翻开等菜单项拖进“编辑上下文菜单图13-12 利用“自定义对话框的“菜单页编辑上下文菜单6工具栏和菜单项选择项利用“自定义对话框的“选项页参见图13-13上部的“工具栏,可以选择是否“在工具栏上显示屏幕提示即鼠标悬浮时的tip,以及是否“在屏幕提示中显示快捷键,它们的区别如:或。还可以在“选项页中选择工具栏是否使用“大图标参见图13-
19、13。图13-13 “自定义对话框的“选项页与设置工具条上的图标大小利用 “选项页下部的“个性化菜单和工具栏,选择是否“菜单首先显示最近使用的命令,以及是否在“短暂延迟后显示完整菜单,参见图13-14。 (a) 首先显示最近使用的菜单项 (b) 短暂延迟后显示完整菜单 (c) 直接显示完整菜单图13-14 是否显示完整菜单 窗口框架MFC功能包引入了全新的窗口框架,支持窗口停靠、控制条窗格、停靠站条、窗格容器、窗格分隔条、自动隐藏控制条、选项卡控制条和Outlook控制条等。.1 窗口停靠MFC功能包引入了类似于Visual Studio界面的窗口停靠docking功能。应用程序的主框架窗口通
20、常由CFrameWndEx或CMDIFrameWndEx类表示,主框架也被称为停靠站dock site。.2 控制条窗格在MFC功能包中,控制条被称为窗格pane,是从CBasePane类派生的。而传统控制条基类为CControlBar,参见图13-15其中带星号的为功能包新增类。图13-15 控制条窗格类窗格的父窗口可为以下三种类型之一:停靠站、停靠条、或袖珍框架窗口,参见图13-16。图13-16 MFC功能包创立的应用程序有两类窗格:大小不可调的及大小可调的。大小可调的窗格如状态条和工具条可以使用分隔条splitter或滑条slider来调整大小。大小可调的窗格可构成容器,即一个窗格中可
21、停靠假设干其他窗格,在它们之间用分隔条分开。但是,大小可调的窗格不能被粘接停靠到停靠条。大小不可调的窗格从CPane类派生,而大小可调的窗格那么从CDockablePane类派生。.3 停靠站在应用程序中,停靠站dock site即主框架窗口拥有所有的窗格和袖珍框架窗口。停靠站包含一个CDockingManager成员,该成员维护着属于此停靠站的所有窗格的一个列表。该列表是排好序的,使得在外部边界上创立的窗格,被放在列表的开始处。在架构framework重绘停靠站时,它会遍历该列表,调整其中每个窗格的布局,以放入停靠站的当前矩形范围中。在你需要调整停靠布局时,可以调用AdjustDocking
22、Layout或RecalcLayout函数,架构会重定向这一调用到停靠管理器。.4 停靠条每个主框架窗口都可以沿其边框放置停靠条。停靠条dock bar是一个属于CDockSite类的窗格。停靠条可以接受派生于CPane的对象,如工具条。在主框架窗口初始化时,调用CBasePane类的EnableDocking函数来创立停靠条、调用CDockablePane类的EnableAutoHideBars函数来激活自动隐藏条。EnableAutoHideBars创立CAutoHideDockSite对象,并放置它们紧邻每个停靠条。每个停靠条被分成假设干停靠行dock row,停靠行由CDockingP
23、anesRow类表示。每个停靠行包含一个工具条列表。如果用户停靠一个工具条或将工具条从一个停靠行移动到同一停靠条的另一个停靠行时,架构会或者创立一个新的停靠行并相应地调整停靠条的大小;或者放置该工具条到一个已存在的停靠行上。.5 袖珍框架窗口袖珍框架窗口mini-frame window是一种位于迷你型框架窗口中的浮动窗格。它由只能包含唯一一个窗格的CMDITabInfo类和可以包含几个窗格的CMultiPaneFrameWnd类来表示。你可以在代码中,通过调用CBasePane:FloatPane函数来浮动窗格。当窗格浮动后,架构会自动创立一个袖珍框架窗口,而且该袖珍框架窗口成为浮动窗格的父
24、窗口。在浮动的窗格停靠时,架构会重置其父窗口,而且浮动窗格变成一个停靠条对工具条或一个停靠站对大小可改变的窗格。.6 窗格分隔条窗格分隔器pane divider也叫滑条slider或分隔条splitters,由CPaneDivider类表示。在用户停靠窗格时,架构会创立窗格分隔条,不管该窗格是停靠在停靠站还是另一个窗格之中。当窗格停靠到停靠站时,窗格分隔条会调用默认的窗格分隔条。默认窗格分隔条,负责所有停靠进停靠站的窗格的排列布局。停靠管理器维护着一个默认窗格分隔条的列表和一个窗格的列表。停靠管理器负责所有停靠窗格的排列布局。.7 窗格容器所有大小可变的窗格,在相互停靠时,都被维护在由CPa
25、neContainer类表示的容器container中。每个容器都具有假设干指针,分别指向左窗格、右窗格、左子容器、右子容器、和左右局部之间的分隔条,其中的左和右不是指物理上的边侧,而是标识树结构的分支。用这种方式,我们可以建造一棵窗格和分隔条的树,从而可达成复杂的窗格布局,改变窗格大小以使它们合在一起。CPaneContainer类维护容器树,它也维护位于此树中的两个窗格和分隔条列表。窗格容器管理器,通常被植入带有多个窗格的默认滑条和袖珍框架窗口之中。.8 自动隐藏控制条在默认情况下,每个CDockablePane都支持自动隐藏特性auto-hide feature。当用户单击CDockab
26、lePane标题上的钉栓pin钮时,架构会切换窗格到自动隐藏模式。为了处理单击,架构会创立一个CMFCAutoHideBar类和一个CMFCAutoHideButton类以及CMFCAutoHideBar对象。架构将新的CMFCAutoHideBar放到CAutoHideDockSite中。架构还将CMFCAutoHideButton附加到工具条。CDockingManager类维护CDockablePane。.9 选项卡控制条与Outlook条CMFCBaseTabCtrl类,实现具有可分标签tab选项卡tabbed窗口的根本功能。为了使用CMFCBaseTabCtrl对象,需在你的应用程序
27、中初始化CBaseTabbedPane类。CBaseTabbedPane派生于CDockablePane,维护着一个指向CMFCBaseTabCtrl对象的指针。CBaseTabbedPane使用户能够停靠和调整选项卡控制条tabbed control bar的大小。可使用CDockablePane:AttachToTabWnd函数,来动态创立被停靠和标注tabbed的控制条。Outlook景色条bar控件也是基于选项卡条的,对应的类CMFCOutlookBar也派生于CBaseTabbedPane。Outlook条是一种选项卡窗格tabbed pane,具有Microsoft Outlook
28、 2000 或Outlook 2003中的导航窗格Navigation Pane的可视外观。CMFCOutlookBar对象包含一个CMFCOutlookBarTabCtrl类的对象和一系列选项卡。选项卡tab可以是一个CMFCOutlookBarPane类对象,或是一个CWnd派生类的对象。对用户来说,Outlook条表现为一系列按钮和一个显示区域,当用户单击一个按钮时,对应的控件或窗格就被显示出来。 应用程序架构MFC功能包增加了与传统的应用程序框架基类相对应的扩展类,我们可以利用这些类的手工编码来创立多种具有功能包新界面的MFC应用程序。.1 类层次结构传统的MFC应用程序的架构类参见图
29、13-17下部,都是从MFC类库中的对应基类参见图13-17上部派生的,可参见12.2节。为了能支持新图形用户界面,VC08的MFC功能包增加了这些基类的扩展版参见图13-17中部,如应用程序类C*App的基类是从CWindApp派生的CWindAppEx类、单文档应用程序的主框架窗口类CMainFrame的基类是从CFrameWnd派生的CFrameWndEx类、多文档应用程序的主框架窗口类CMainFrame的基类是从CMDIFrameWnd派生的CMDIFrameWndEx类、多文档应用程序的子框架窗口类CChildFrame的基类是从CMDIChildWnd派生的CMDIChildWn
30、dEx类。文档类和文档模板类那么没有变化。CObjectCCmdTargetCWndCWinTreadCWinAppCFrameWndCViewCScrollViewCDocTemplateCDocumentCSingleDocTemplateCMultiDocTemplateCTestAppCMainFrameCTestViewCChildFrameCTestDoc传统MFC类你的应用程序类CWinAppExCFrameWndExCMDIFrameWndCMDIChildWndCMDIFrameWndExCMDIChildWndExMFC功能包扩展类图13-17 MFC应用程序工程Test中
31、的主要类及其基类许多新功能都依赖于新版本扩展类CWinAppEx、CFrameWndEx和CMDIFrameWndEx,这些类代表着大多数MFC应用程序的根底。这些新的基类提供了支持众多新用户界面功能如功能区、可停靠、可调整大小的窗口窗格、以及工作区持久性等所需的全部要素。.2 最小功能包应用程序本小节的代码显示了可支持功能区栏的最小应用程序对象。程序的应用程序类CMinApp由CWinAppEx派生而来,可实现大家所熟悉的InitInstance成员函数通常用于创立应用程序的主窗口。千万不要忘记调用SetRegistryKey成员函数来设置应用程序的注册表位置,因为新的架构类都要依赖于它。然
32、后,InitInstance继续以通常的方式创立主窗口。似中的最小MFC程序,需先创立一个名为Min的“Visual C+/Win32”的“Win32工程,在其“应用程序设置页中的“附加选项栏中,选中“空工程。并修改工程属性中的“配置属性/常规页中的“工程默认值栏的“MFC的使用为“在静态库中使用MFC或“在共享DLL中使用MFC。然后将下面的最小VC08 MFC功能包应用程序的具体代码之CPP文件添加到该工程中运行结果如图13-18所示:#include #include #include class CMainWindow : public CFrameWndEx public: CMai
33、nWindow();CMainWindow:CMainWindow() Create(NULL, /class name LMinimum Feature Pack CMyApp); /window nameclass CMinApp : public CWinAppEx public: virtual BOOL InitInstance();BOOL CMinApp:InitInstance() SetRegistryKey(LSYSUMinSample);/ 此处不能直接使用CFrameWndEx类的保护型默认构造函数m_pMainWnd = new CMainWindow; m_pMai
34、nWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE;CMinApp theApp;图13-18 最小功能包应用程序例.3 Office功能区用户界面利用MFC的功能包,我们可以非常轻松地向MFC框架窗口,添加与Microsoft Office 2007系统功能区元素类似的功能区栏。从概念上讲,功能区ribbon由多个被称为类别category的选项卡tab组成,每个选项卡都承载着一组面板panel。反过来,这些面板又承载着功能区元素或控件,它们分别代表特定于应用程序的各种操作。如果功能区承载着应用程序按钮左上角
35、的大圆按钮,那么在用户单击应用程序按钮时所显示的弹出窗口中也会显示一个面板,它被视为功能区的主类别。CMFCRibbonBar类可实现功能区栏本身,而CMFCRibbonCMyAppButton类那么代表功能区栏所承载且显示在窗口框架左上角的应用程序按钮。功能区栏通常是在WM_CREATE消息处理程序中创立和准备的。要创立功能区栏,只需调用CMFCRibbonBar的Create成员函数,以提供将其附加到其中的窗口框架的地址即可,然后根据需要填充它。AddMainCategory成员函数将主类别添加到功能区,并返回一个指向CMFCRibbonMainPanel的指针,你可以利用它向其中添加将要
36、显示在此面板中的功能区元素。通过调用AddCategory成员函数,可向其中添加更多的类别来表示功能区的选项卡。AddCategory返回一个指向CMFCRibbonCategory对象你可使用其AddPanel成员函数向其中添加面板的指针。AddPanel返回一个指向CMFCRibbonPanel对象可像使用功能区的主面板一样向其中添加功能区元素的指针。最后,你可使用CMFCVisualManager: SetDefaultManager静态成员函数来设置负责处理框架窗口的样式和外观的可视化管理器。图13-19显示了功能区应用程序的可能外观,假定你已为功能区栏上的按钮添加了必要的事件处理程序
37、。图13-19 功能区应用程序下面的代码显示了具有功能区栏和应用程序按钮的一个最小SDI框架窗口。其中的应用程序按钮并不是必需的,但通常会与功能区栏结合使用,为应用程序提供各种各样的主菜单,以代替传统的“文件菜单。class CMainWindow : public CFrameWndEx DECLARE_MESSAGE_MAP()public: CMainWindow(); int OnCreate(CREATESTRUCT* createStruct); CMFCRibbonBar m_ribbon; CMFCRibbonCMyAppButton m_appButton;BEGIN_MES
38、SAGE_MAP(CMainWindow, CFrameWndEx) ON_WM_CREATE()END_MESSAGE_MAP()CMainWindow:CMainWindow() Create(0/*class name*/, LMFC Ribbon Sample CMyApp/*window name*/);int CMainWindow:OnCreate(CREATESTRUCT* createStruct) if (-1 = _super:OnCreate(createStruct) return -1; if (-1 = m_ribbon.Create(this) return -
39、1; m_appButton.SetImage(IDB_APP_BUTTON); m_ribbon.SetCMyAppButton(&m_appButton, CSize(45, 45); CMFCRibbonMainPanel* appButtonMenu = m_ribbon.AddMainCategory(LMenu, IDB_APP_BUTTON_MENU_SMALL, IDB_APP_BUTTON_MENU_LARGE); appButtonMenu-Add(new CMFCRibbonButton(ID_FILE_NEW, L&New, 0, / small image index
40、 0); / large image index appButtonMenu-Add(new CMFCRibbonButton(ID_FILE_OPEN, L&Open., 1, / small image index 1); / large image indexappButtonMenu-AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, LE&xit, 15/*small image index*/);CMFCRibbonCategory* category = m_ribbon.AddCategory(LHome, IDB_RI
41、BBON_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 0); / large image index panel-Add(new CMFCRibbonButton(ID_EDIT_CUT, LCut, 1); panel-Add(new CMFCRibbonButton(ID_EDIT_C
42、OPY, 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); CMFCVisualManager:SetDefaultManager( RUNTIME_CLASS(CMFCVisualManagerOffice2007); CMFCVisualManagerOffice2007:SetStyle (CMFCVisualM
43、anagerOffice2007:Office2007_LunaBlue); return 0;.4 选项卡式多文档界面MFC一直都支持 MDI 实现及其文档/视图体系结构,但图13-20 a)中所示的传统 MDI早已过时,用户可能会认为你的应用程序从Windows 95开始就再也没有更新过。现在,绝大多数用户都期望可通过窗口边缘的选项卡来访问多个文档,而这正是新的CMDIFrameWndEx MDI框架窗口所提供的功能,参见图13-20 b)。 a) 传统MDIb) 选项卡式MDI图13-20 多文档界面的MFC应用程序我们需要更新多文档/视图应用程序对象以支持新的框架窗口。下面的代码显示了
44、满足需要的最小选项卡式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() SetRegistryKey(LSampleCompanySampleProduct); VERIFY(InitContextM
45、enuManager();AddDocTemplate(new CMultiDocTemplate(IDR_CHILDFRAME,RUNTIME_CLASS(Document),RUNTIME_CLASS(CMDIChildWndEx),RUNTIME_CLASS(View); CMainWindow* mainWindow = new CMainWindow(); VERIFY(mainWindow-LoadFrame(IDR_MAINFRAME); m_pMainWnd = mainWindow; m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-
46、UpdateWindow(); return TRUE;它类似于传统的 MDI 应用程序对象,但有几点值得一提。首先,子窗口框架的运行时类是CMDIChildWndEx,而非传统的CMDIChildWnd类。要准备在选项卡式视图之间进行切换时使用的菜单管理器,还需调用InitContextMenuManager函数。下面的代码显示了最小选项卡式MDI框架窗口。同样,你会看到开启此功能是多么地简单。实际只需调用EnableMDITabbedGroups成员函数来启用MDI选项卡式分组功能即可。CMDITabInfo类提供了各种成员变量,可使用它们来自定义选项卡式分组的外观和行为。顾名思义,它甚至
47、还允许用户拖动不同的视图来创立垂直或水平对齐的选项卡组。class CMainWindow : public CMDIFrameWndEx DECLARE_DYNCREATE(CMainWindow) DECLARE_MESSAGE_MAP()private: int OnCreate(CREATESTRUCT* createStruct);IMPLEMENT_DYNCREATE(CMainWindow, CMDIFrameWndEx)BEGIN_MESSAGE_MAP(CMainWindow, CMDIFrameWndEx) ON_WM_CREATE()END_MESSAGE_MAP()in
48、t CMainWindow:OnCreate(CREATESTRUCT* createStruct) if (-1 = _super:OnCreate(createStruct) return -1; CMDITabInfo tabInfo; tabInfo.m_bAutoColor = true; tabInfo.m_bDocumentMenu = true; EnableMDITabbedGroups(true, tabInfo); return 0; 编写功能区应用程序功能区ribbon用于代替传统的菜单和工具条,是微软公司推崇的新图形界面。MFC功能包提供了对功能区界面的支持,但是却没
49、有提供功能区资源的交互式设计界面。即将推出的Visual C+ 2021MFC 10.0可弥补这一缺陷。 MFC功能包手工编程下面通过一个简单的例子,来介绍如何用MFC功能包来创立一个新的功能区应用程序,并在程序中手工添加自己的界面元素和代码。此节所对应的英文帮助文档,位于VS08SP1的MSDN帮助系统的“目录/开发工具和语言/Visual Studio/Visual C+/参考信息/Libraries Reference/MFC Feature Pack for Visual C+ 2021/Walkthroughs/Walkthrough: Create a New Ribbon App
50、lication By Using MFC之中。1创立功能区应用程序工程选“文件新建工程菜单项、或按“Ctrl+Shift+N组合键、或选“起始页创立工程选项。在弹出的“新建工程对话框中,在左边的“工程类型栏中选“Visual C+MFC项,在右边的“模版栏中选“MFC应用程序项,在下边的“位置栏选择新工程目录的父目录所在的路径如E:,在“名称栏中键入你的程序工程名如Rib,不选中“创立解决方案的目录选项,按“确定钮,参见图13-21。图13-21 新建工程对话框在弹出的“MFC应用程序向导对话框的欢送页中,按“下一步按钮或单击左栏中的“应用程序类型项,进入该对话框的“应用程序类型页。在“应用
51、程序类型页右边上部的“工程类型栏,选中“Office单项选择钮默认是“Visual Studio。保持“视觉样式和颜色栏下拉式列表中的默认“Office 2007蓝色主题条目不变,同时保持“启用视觉样式切换复选框被选中。该页的其余选项也保持默认设置不变,参见图13-22。图13-22 选择工程类型和视觉样式单击左栏中的“用户界面功能项,进入“MFC应用程序向导对话框的“用户界面功能页。重要步骤在“用户界面功能页中,保持右边“命令栏下部的“使用功能区单项选择项被选中,参见下列图13-23。图13-23 选择“使用功能区按“下一步钮或单击左边的“高级功能项,进入“高级功能页。为了简单起见,我们这里
52、去选右边“高级框架窗格栏中的所有复选框“导航窗格和“标题栏默认是选中的,参见图13-24。图13-24 去选高级框架窗格选项按“完成钮关闭“MFC应用程序向导对话框,向导会自动生成对应的工程。编译运行此工程,结果如图13-25所示。图13-25 功能区Office类型的MFC功能包应用程序例可见,向导为我们的应用程序自动创立了一个功能区,含有一个功能区类别ribbon category选项卡tab,称为主要Home。该功能区类别包含三个功能区面板ribbon panel分别叫做剪贴板Clipboard、视图View和窗口Window。应用程序功能区的其他菜单见图13-26。a) 应用程序大图标
53、的文件菜单b) 自定义快速访问工具栏菜单c) 样式菜单图13-25 MFC功能包应用程序的功能区菜单2添加类别到功能区由工程创立的功能区对象位于CMainFrame类的头文件中:CMFCRibbonBar m_wndRibbonBar;为了向该功能区增加新的类别category对象,需要调用CMFCRibbonBar类的成员函数AddCategory:CMFCRibbonCategory* AddCategory( LPCTSTR lpszName, / 类别名,会出现在功能区的标签中 UINT uiSmallImagesResID, / 小图片资源ID UINT uiLargeImagesR
54、esID, / 大图片资源ID CSize sizeSmallImage=CSize(16, 16) 1, / 小图片的尺寸,默认为16*16 CSize sizeLargeImage=CSize(32, 32) 3, / 大图片的尺寸,默认为32*32 int nInsertAt=-1, / 插入位置序号,默认值-1表示添加到已有功能区类别的后面 CRuntimeClass* pRTI=NULL / 指向运行类的指针);在CMainFrame类的OnCreate函数的中部,已有如下两行代码用于创立和初始化功能区对象的:m_wndRibbonBar.Create(this); / 创立功能区控
55、件InitializeRibbon(); / 初始化定制功能区在CMainFrame类的InitializeRibbon函数的底部,我们添加如下代码:/ 添加“定制类别对象:strTemp.LoadString(IDS_RIBBON_CUSTOM);CMFCRibbonCategory* pCategoryCustom =m_wndRibbonBar.AddCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);其中,strTemp 为原有的在InitializeRibbon函数起始处定义的局部串变量:CString strTemp;而CString 类
56、的LoadString成员函数:BOOL LoadString( UINT nID );用于装入指定ID的串资源;IDS_RIBBON_CUSTOM是我们自己在工程的串表String Table资源中增加的新类别名串“定制(&C)的ID;而IDB_FILESMALL和IDB_FILELARGE那么为已有的小和大文件图片资源的ID。编译运行修改后的工程,结果是功能区中新增加了空的“定制类别对象,如图13-26所示。图13-26 添加“定制类别到功能区3添加面板到类别一个功能区面板ribbon pane内含有一组逻辑相关的元素item。为了添加功能区面板到功能区类别,你可以使用CMFCRibbon
57、Category类的AddPanel method函数:CMFCRibbonPanel* AddPanel( LPCTSTR lpszPanelName, / 面板名 HICON hIcon=0, / 图标句柄,用于快速访问工具条 CRuntimeClass* pRTI=NULL / 指向运行类的指针);例如,在CMainFrame类的InitializeRibbon函数的底部,在你刚刚的添加功能区类别的代码后,添加如下代码:/ 创立并添加“喜爱面板:strTemp.LoadString(IDS_RIBBON_FAVORITES);CMFCRibbonPanel* pPanelFavorite
58、s =pCategoryCustom-AddPanel(strTemp, m_PanelImages.ExtractIcon(15);其中,IDS_RIBBON_FAVORITES是我们自己在工程的串表资源中增加的新面板名串“喜爱的ID;m_PanelImages为工程创立时自动定义的一个CMFCToolBarImages类对象,已经装入了工程中已有的位图资源IDB_BUTTONS对应的位图文件为res,含有27个图标,参见图13-27。图13-27 工程的按钮位图资源IDB_BUTTONS参见InitializeRibbon函数顶部处的代码:/ 加载面板图像:m_PanelImages.Se
59、tImageSize(CSize(16, 16);m_PanelImages.Load(IDB_BUTTONS);而CMFCToolBarImages类的ExtractIcon成员函数:HICON ExtractIcon( int nIndex );的功能是从工具条位图中提取指定序号的图片,并返回对应图标的句柄。编译运行,结果如图13-28所示。可见,在功能区的“定制类别选项卡的左边,出现了一个“喜爱面板。图13-28 添加“喜爱面板到“定制类别4添加元素到面板为了添加元素到上一步所创立的面板里,可以调用CMFCRibbonPanel类的Add方法:virtual void Add( CMFC
60、RibbonBaseElement* pElem );其中的CMFCRibbonBaseElement类,是所有能被添加到面板中的元素如按钮、复选框、和组合框等的基类。我们首先添加一个“打印按钮,它将具有一个子菜单,包含一个使用默认打印机打印的“快速打印命令。这两个命令都已经被定义在此应用程序的应用程序大图标的菜单中。在CMainFrame类的InitializeRibbon函数的底部,在你刚刚的添加功能区面板的代码后,添加如下代码:/ 创立“快速打印按钮:strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);CMFCRibbonButton* pBtnFavP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度执法资格试题含完整答案详解【各地真题】
- 2024-2025学年度安徽林业职业技术学院妇产护理期末模考模拟试题及参考答案详解【模拟题】
- 心肌梗死患者的用药护理
- 2024-2025学年度冶金工业技能鉴定经典例题带答案详解(精练)
- 2024-2025学年度电梯考试测试卷(达标题)附答案详解
- 2024-2025学年度云南能源职业技术学院单招《物理》考前冲刺测试卷含答案详解(基础题)
- 2024-2025学年农村信用社招聘考试能力检测试卷带答案详解(典型题)
- 2024-2025学年度中医执业医师模拟题库附参考答案详解(B卷)
- 2024-2025学年医师定期考核考试综合练习及完整答案详解【夺冠】
- 2024-2025学年度电工考前冲刺练习试题及参考答案详解(巩固)
- 2026年滁州职业技术学院单招综合素质考试题库附答案详解
- 2026陕煤集团榆林化学有限责任公司招聘(162人)考试备考题库及答案解析
- 退役军人保密教育
- 数控多工位钻床的设计
- MHC与移植免疫课件
- 部编四年级语文下册 全册教案 (表格式)
- GB/T 26216.2-2019高压直流输电系统直流电流测量装置第2部分:电磁式直流电流测量装置
- 《花卉生产技术》课件第十一章 水生花卉
- 国家免费孕前优生健康检查项目技术服务
- 规模经济与范围经济 课件
- 创业引导-与企业名家面对面答案
评论
0/150
提交评论