首页 MFC功能包

MFC功能包

举报
开通vip

MFC功能包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)等等。程序员可以利用该功能包编写具有类似于微软公...

MFC功能包
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或Internet Explorer界面视觉样式的应用程序。 MFC功能包的改进主要体现在新型用户界面上,主要包括:功能区(ribbon)、选项卡(tab)窗口和窗格(pane)、视觉样式切换(换肤)、可停靠与自动隐藏的控制条和窗格等。 此功能包的帮助信息,位于MSDN的“目录\开发工具和语言\Visual Studio文档\Visual C++\参考信息\Libraries Reference\MFC Feature Pack for Visual C++ 2008”(主要 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 在其中的“Reference\Classes”子目录中)。 5.1 新增功能 下面列出MFC功能包在若干方面增加的具体新功能: 1.菜单(Menu) · 微软Office样式的菜单。 · Office样式的菜单条——你可以停靠,而且还可以用图片来定制。 · 菜单动画——图片淡入/渐显(fades in)、展开(unfolds)或滑进视图(slides into view)。 · 菜单阴影。 · 菜单工具提示(tooltips)。 · 可滚动菜单。 · 自绘(owner-drawn)菜单图片。 · 位于菜单左边的自绘标识(logo)。 · 可在运行时修改菜单字体。 · MRU(Most Recently Used,最近使用)列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 和窗口列表。 · 可去掉的菜单(Tear-off menus)。 · 右对齐的组合框(似Office 2003菜单条右端的帮助组合框)。 2.工具条(Toolbars) · 按钮图片——可在鼠标悬浮(hovers over,盘旋)于按钮上时更换。 · 大图标。 · 双波浪式(double-chevron)按钮——表示存在比当前可见部分更多的按钮。 · 不可定制的工具条。 · 在菜单和工具提示中自动创建键盘快捷键。 · 支持钢筋(Rebar,一种子窗口容器)。 · 图片下的文本。 · 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的组合框和文本框按钮。 · 标准字体组合框和字体大小组合框按钮。 · 标准颜色选择器控件。 · MS Office视觉样式(visual styles)。 · 具有不截图的透明工具条。 · 包含钉销钮的下拉式可移去窗格(Drop-down tear-off panes that contain a pin button)。 3.窗格(Panes) 窗格是一种窗口,通常是可调整大小、可移去和可停靠的(Panes are windows that are typically resizable, tear-off, and dockable)。窗格支持如下功能: · MS Office样式的对话框条。 · Office样式的菜单条——支持图片和停靠。 · MS Outlook样式的快捷条(shortcut bar)。 · Outlook样式的标题条(caption bar)。 · Outlook样式的任务窗格(task pane)。 · Visual Studio样式的窗格——类似的工具条、属性和浏览器窗格(resemble toolbox, property, and browser panes)。 · 钢筋(Rebar)控件——其内容和位置在应用程序的多次运行之间持续不变。 · 状态条——支持图标、动画和进度条。 · 打印预览服务。 4.功能区控件(Ribbon Control) 功能区(Ribbon:缎丝带、带状物、条板。微软:功能区、带状条、格式栏)是新的Microsoft Office Fluent用户界面 (UI) 的一部分。在面板设计器中,功能区包含一些用于创建、编辑和导出面板及其元素的上下文工具。 · 通用功能区特性(General ribbon features)。 · Vista Aero集成(航空主题是Windows Vista的默认样式)。 · 功能区窗格。 · 功能区上下文的类别(选项卡标签)(Ribbon contextual categories (tabs))。 · 功能区元素。 · 功能区键提示(keytips)。 · 功能区调色板(图表种类[galleries])。 · 功能区用户化定制。 · 功能区最小工具条。 · 功能区启动(Launch)按钮。 · 功能区主(Main)按钮。 · 功能区状态条。 5.桌面报警(Desktop Alert) 微软的Outlook桌面报警,显示一个包含通知的弹出窗口,如Outlook收件箱中的通知邮件到达消息的窗口。 6.控件(Controls) · URL链接钮。 · 装饰有位图图片的按钮。 · 菜单钮。 · 可编辑列表。 · 颜色选择器控件。 · 壳(Shell)树控件。 · 壳列表控件。 · 屏蔽的(Masked)编辑控件。 · 定制的(Custom)工具提示控件。 · 包含浏览钮的编辑控件。 · 属性格(Property grid)。 · MDI选项卡(tab)控件。 · 选项卡控件——支持诸如三维、Excel、OneNote等视觉样式。 7.对话框(Dialog Boxes) · Windows管理器对话框。 · Office样式的颜色选择对话框。 · 图片编辑器对话框。 · 属性单(Property sheets)——包含若干控件,诸如快捷条、树控件或Office 2007样式列表等。 8.定制(Customization) 用户可自定义控件的颜色、图片和文本等。 · 位于工具条和菜单之间的拖拉钮(drag button)。 · 使用简单的位图编辑器来编辑自定义的(user-defined)图片。 · 在运行时创建自定义的工具条。 · 定制上下文菜单。 · 使用工具条定制 菜单来快速定制工具条按钮。 · 使用菜单资源来自动创建用户化类别(customization categories)。 · 利用按下Alt键并拖曳工具条按钮来定制工具条。 · 定制鼠标事件处理。 · 定制快捷键。 · 保存和恢复工具条与菜单的状态到注册表。 · 访问工作区(workspace)管理器以保持定制的设置到注册表。 · 调用自定义工具。 9.可视化(Visualization) MFC提供了可视化管理器,它按照用户选择的视觉样式来绘制控件。可视化支持如下视觉样式: · Microsoft Office 2000/XP/2003/2007视觉样式。 · Visual Studio 6.0/.NET/2005视觉样式。 10.特殊功能(Special Features) MFC支持如下窗口功能: · MDI选项卡组(tabbed groups)。 · 可分离的选项卡。 · 自动隐藏窗口。 MFC还支持如下操作: · 保存和装入已打开文档的状态。 · 将若干窗格停靠到浮动的袖珍(mini)框架窗口。 · 运行时改变停靠类型: · 标准——在拖动窗口期间不画窗口的内容(如Microsoft Visual Studio .NET 2003)。 · 立即——在拖动窗口期间画窗口的内容(如Microsoft Visio)。 · 灵巧(Smart)——在拖动窗口期间画窗口的内容而且有一箭头标记指出窗口可停靠的位置(如Microsoft Visual Studio 2005/2008)。 · α混合图片(支持32位图片)。 · 按从右到左(RTL = Right-To-Left)的格式显示全球化文本。 · 允许可达性支持(Enable accessibility support)。 5.2 视觉样式切换 下面我们通过一个简单的例子,展示一下MFC功能包的视觉样式切换效果。 为此,我们创建一个单文档界面的MFC应用程序FP1。在“MFC应用程序向导”对话框的“应用程序类型”页(参见下图),选中“应用程序类型”栏的“单个文档”单选项、选中“项目类型”栏的“MFC标准”单选项,其它保持不变(如“视觉样式和颜色”栏的下拉式列表中为“Visual Studio 2005”选项、“启动视觉样式切换”复选框是选中的),按“完成”钮生成FP1项目。 直接编译运行的结果如下图所示: Visual Studio 2005视觉样式 在其“视图”菜单中有一个“应用程序外观”子菜单,其中包含如下菜单项(参见下图): · Windows 2000 · Office XP · Windows XP · Office 2003 · Visual Studio.NET 2005(缺省值) · Office 2007 · 蓝色样式 · 黑色样式 · 银色样式 · 水绿色样式 缺省的视觉样式为我们在在“MFC应用程序向导”对话框的“应用程序类型”页“视觉样式和颜色”栏的下拉式列表中所选中的选项(Visual Studio 2005)。 下面是其它视觉样式的效果图: Windows 2000 Office XP Windows XP Office 2003 Office 2007的蓝色样式 Office 2007的黑色样式 Office 2007的银色样式 Office 2007的水绿色样式 5.3 自定义设置 在程序的“视图”菜单的“工具栏和停靠窗口”子菜单中,还有一个“自定义”菜单项,利用其弹出的对话框,可以进行许多自定义设置(似MS Word 2003)。下面是“自定义”对话框的若干设置页: “命令”页 “工具栏”页 “键盘”页 “菜单”页 “选项”页 1.增删工具栏按钮 可以按工具栏右端的工具栏选项钮,利用弹出的“添加或删除按钮”子菜单中的“标准”子菜单,来增/删(显示/隐藏)标准工具栏中的按钮。参见下图: 利用工具栏选项的“添加或删除按钮”子菜单中的“自定义”菜单项(或利用程序“视图”菜单的“工具栏和停靠窗口”子菜单中的“自定义”菜单项)弹出的“自定义”对话框的“命令”页,还可以使用各菜单中的菜单项来可视化地交互增删、分组、调位工具栏上的按钮(或菜单项)(似MS Office和MS Visual Studio)。 2.新建工具栏 利用“自定义”对话框的“工具栏”页(参见下图),可以在运行时为应用程序动态创建新的工具栏,并在其中增加若干(菜单项或)按钮。具体的做法是: 在对话框中按“新建”钮,在弹出的“工具栏名称”对话框中输入新工具栏的名称,如“编辑”,按“确定”关闭此对话框。参见下图: 利用“自定义”对话框的“命令”页,向出现的浮动空工具栏中添加若干菜单项按钮,如“编辑”菜单中的“剪切”、“复制”和“粘贴”菜单项按钮:。可以将新加的工具栏停靠到自己喜欢的位置,如标准工具栏之下,参见下图: 3.设置快捷键 利用“自定义”对话框的“键盘”页,可以在运行时为应用程序动态添加菜单项对应的快捷键。具体做法是,在对话框中左上部的“类别”栏的下拉式列表中选择一菜单(如“文件”),在其下的“命令”栏的列表中选择一菜单项(如“打印预览”),定位于对话框中下部的“按新快捷键”栏下的文本编辑框,按快捷键组合键(如Ctrl+R),再按对话框的“分配”钮完成操作。参见下图: 如果你选择的组合键已经被分配给了本程序的其它菜单项(此时在该文本编辑框下面的“已分配给:”之下,会显示此组合键所原来所对应的菜单项名串),则“分配”钮是灰色不可用的。 另外,按对话框的“删除”钮,可以删除当前菜单项的已有快捷键。按对话框的“全部重置”钮,可以恢复初始的快捷键设置(你在程序运行后所作的快捷键设置将全部作废)。 4.切换菜单 利用“自定义”对话框的“菜单”页左边的“应用程序框架菜单”栏的“显示菜单”下拉式列表,可以在框架窗口的多个菜单中进行强制切换,参见下图。 例如,对多文档界面的应用程序,可以在未打开子窗口时的(含3个下拉菜单的)“默认菜单”和打开子窗口后的(含5个下拉菜单的)与应用程序项目同名的菜单之间进行强制切换。 5.编辑上下文菜单 利用“自定义”对话框的“菜单”页右边的“上下文菜单”栏的“选择上下文菜单”下拉式列表,可以在选择已有的上下文菜单(如“编辑”)后,再切换到“命令”页,然后就可以通过交互式可视操作来编辑该上下文菜单,包括增加、删除、移位、分组菜单项等。参见下二图。 6.工具栏和菜单选项 利用“自定义”对话框的“选项”页(参见下图)上部的“工具栏”,可以选择是否“在工具栏上显示屏幕提示”(即鼠标悬浮时的tip),以及是否“在屏幕提示中显示快捷键”。它们的区别如:或。 还可以在“选项”页中选择工具栏是否使用“大图标”(参见下二图): 利用 “选项”页下部的“个性化菜单和工具栏”,选择是否“菜单首先显示最近使用的命令”,以及是否在“短暂延迟后显示完整菜单”,参见下图: (a) 首先显示最近使用的菜单项 (b) 短暂延迟后显示完整菜单 (c) 直接显示完整菜单 5.4 库架构 1.窗口停靠 MFC功能包引入了类似于Visual Studio GUI的窗口停靠(window docking)功能。 应用程序的主框架窗口通常由CFrameWndEx或CMDIFrameWndEx类表示。主框架被称为停靠站(dock site,停靠场所/地点)。 2.控制条窗格 在MFC功能包中,控制条被称为窗格(pane),是从CBasePane类派生的。而传统控制条基类为CControlBar。参见右图(其中带星号的为功能包新增的类)。 窗格的父窗口可为以下三种类型之一:停靠站、停靠条(dock bar)或袖珍框架窗口(mini-frame window)。参见下图。 有两类窗格:非大小可调的(non-resizable)及大小可调的(resizable)。大小可调的窗格(如状态条和工具条)可以使用分隔条(splitter)或滑条(slider)来调整大小。大小可调的窗格可构成容器(form container)(一个窗格可被停靠到另一个窗格,在它们之间生成一个分隔条)。然而,大小可调的窗格不能被粘接(停靠)到停靠条。非大小可调的窗格从CPane类派生,而大小可调的窗格则从CDockablePane类派生。 MFC功能包创建的应用程序 3.停靠站 在应用程序中,停靠站(dock site)(即主框架窗口)拥有所有的窗格和袖珍框架窗口。停靠站包含一个CDockingManager成员,该成员维护着属于此停靠站的所有窗格的一个列表。该列表是排好序的,使得在外部边界上创建的窗格,被放在列表的开始处。在架构(framework)重绘停靠站时,它会遍历该列表,调整其中每个窗格的布局,以放入停靠站的当前矩形范围中。在你需要调整停靠布局时,可以调用AdjustDockingLayout或RecalcLayout函数,架构会重定向这一调用到停靠管理器。 4.停靠条 每个主框架窗口都可以沿其边框放置停靠条。停靠条(dock bar)是一个属于CDockSite类的窗格。停靠条可以接受派生于CPane的对象,如工具条。在主框架窗口初始化时,调用(CBasePane类的)EnableDocking函数来创建停靠条、调用(CDockablePane类的)EnableAutoHideBars函数来激活自动隐藏条。EnableAutoHideBars创建CAutoHideDockSite对象,并放置它们紧邻每个停靠条。 每个停靠条被分成若干停靠行(dock row),停靠行由CDockingPanesRow类表示。每个停靠行包含一个工具条列表。如果用户停靠一个工具条或将工具条从一个停靠行移动到同一停靠条的另一个停靠行时,架构会或者创建一个新的停靠行并相应地调整停靠条的大小;或者放置该工具条到一个已存在的停靠行上。 5.袖珍框架窗口 袖珍框架窗口(mini-frame window)是一种位于迷你型框架窗口中的浮动窗格。它由(只能包含唯一一个窗格的)CMDITabInfo类和(可以包含几个窗格的)CMultiPaneFrameWnd类来表示。你可以在代码中,通过调用CBasePane::FloatPane函数来浮动窗格。当窗格浮动后,架构会自动创建一个袖珍框架窗口,而且该袖珍框架窗口成为浮动窗格的父窗口。在浮动的窗格停靠时,架构会重置其父窗口,而且浮动窗格变成一个停靠条(对工具条)或一个停靠站(对大小可改变的窗格)。 6.窗格分隔器 窗格分隔器(pane divider)(也叫滑条[slider]或分隔条[splitters])由CPaneDivider类表示。在用户停靠窗格时,架构会创建窗格分隔器,不管该窗格是停靠在停靠站还是另一个窗格之中。当窗格停靠到停靠站时,窗格分隔器会调用默认的窗格分隔器。默认窗格分隔器,负责所有停靠进停靠站的窗格的排列布局。停靠管理器维护着一个默认窗格分隔器的列表和一个窗格的列表。停靠管理器负责所有停靠窗格的排列布局。 7.容器 所有大小可变的窗格(resizable pane),在相互停靠时,都被维护在容器(container)中。容器由CPaneContainer类表示。每个容器都具有若干指针,分别指向左窗格、右窗格、左子容器、右子容器、和左右部分之间的分隔条。(其中的左和右不是指物理上的边侧,而是标识树结构的分支。)用这种方式,我们可以建造一棵窗格和分隔条的树,从而可达成复杂的窗格布局,改变窗格大小以使它们合在一起。CPaneContainer类维护容器树,它也维护位于此树中的两个窗格和分隔条列表。窗格容器管理器通常被植入带有多个窗格的默认滑条和袖珍框架窗口之中。 8.自动隐藏控制条 在默认情况下,每个CDockablePane都支持自动隐藏特性(auto-hide feature)。当用户单击CDockablePane标题上的钉栓(pin)钮时,架构会切换窗格到自动隐藏模式。为了处理单击,架构会创建一个CMFCAutoHideBar类和一个CMFCAutoHideButton类以及CMFCAutoHideBar对象。架构将新的CMFCAutoHideBar放到CAutoHideDockSite中。架构还将CMFCAutoHideButton附加到工具条。CDockingManager类维护CDockablePane。 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条表现为一系列按钮和一个显示区域。当用户单击一个按钮时,对应的控件或窗格就被显示出来。 5.5 应用程序架构 1.类层次结构 下图是传统MFC应用程序架构所涉及主要类的层次结构: MFC应用程序项目(Test)中的主要类及其基类 为了能支持新图形用户界面,VC08的MFC功能包增加了这些基类的扩展版,如应用程序类C*App的基类是从CWindApp派生的CWindAppEx类、单文档应用程序的主框架窗口类CMainFrame的基类是从CFrameWnd派生的CFrameWndEx类、多文档应用程序的主框架窗口类CMainFrame的基类是从CMDIFrameWnd派生的CMDIFrameWndEx类、多文档应用程序的子框架窗口类CChildFrame的基类是从CMDIChildWnd派生的CMDIChildWndEx类。文档类和文档模板类则没有变化。参见下图(的蓝色部分): MFC功能包应用程序项目(Test)中的主要类及其基类 许多新功能都依赖于新版本的CWinAppEx、CFrameWndEx和CMDIFrameWndEx类,这些类代表着大多数MFC应用程序的基础。这些新的基类提供了支持众多新用户界面功能(如可停靠、可调整大小的窗口窗格以及工作区持久性等)所需的全部要素。 2.最小功能包应用程序 本小节的代码显示了可支持功能区栏的最小应用程序对象。如你所见,CMinApp类由CWinAppEx派生而来,可实现大家所熟悉的InitInstance成员函数(通常用于创建应用程序的主窗口)。千万不要忘记调用SetRegistryKey成员函数来设置应用程序设置的注册表位置,因为架构类要依赖于它。然后,InitInstance继续以通常的方式创建主窗口。 似绪论中的最小MFC程序,需先创建一个名为Min的“Visual C++/Win32”的“Win32项目”,在其“应用程序设置”页中的“附加选项”栏中,选中“空项目”。并修改项目属性中的“配置属性/常规”页中的“项目默认值”栏的“MFC的使用”为“在静态库中使用MFC”或“在共享DLL中使用MFC”。然后将下面的最小VC08 MFC功能包应用程序的具体代码之CPP文件添加到该项目中: // Min.cpp #include #include #include class CMainWindow : public CFrameWndEx { public: CMainWindow(); } CMainWindow::CMainWindow() { Create(0/*class name*/, L"Minimum Feature Pack CMyApp"/*window name*/); } class CMinApp : public CWinAppEx { public: virtual BOOL InitInstance(); }; BOOL CMinApp::InitInstance() { SetRegistryKey(L"SYSU\\MinSample"); m_pMainWnd = new CMainWindow; // 此处不能直接使用CFrameWndEx类的 //(保护型)缺省构造函数 m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMinApp theApp; 运行结果如下图所示: 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静态成员函数来设置负责处理框架窗口的样式和外观的可视化管理器。下图显示了功能区应用程序的可能外观(假定你已为功能区栏上的按钮添加了必要的事件处理程序)。 下面的代码显示了具有功能区栏和应用程序按钮的一个最小SDI框架窗口。其中的应用程序按钮并不是必需的,但通常会与功能区栏结合使用,为应用程序提供各种各样的主菜单,以代替传统的“文件”菜单。 class CMainWindow : public CFrameWndEx { DECLARE_MESSAGE_MAP() public: CMainWindow(); private: 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)); CMFCRibbonMainPanel* appButtonMenu = m_ribbon.AddMainCategory(L"Menu", 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 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->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)); 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)); CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_LunaBlue); return 0; } 4.选项卡式多文档界面 MFC一直都支持 MDI 实现及其文档/视图体系结构,但下图中的左图所示的传统 MDI早已过时,用户可能会认为你的应用程序从Windows 95开始就再也没有更新过。现在,绝大多数用户都期望可通过窗口边缘的选项卡来访问多个文档,而这正是新的CMDIFrameWndEx MDI框架窗口所提供的功能,参见下图中的右图。 我们需要更新多文档/视图应用程序对象以支持新的框架窗口。下面的代码显示了满足需要的最小选项卡式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(L"SampleCompany\\SampleProduct"); VERIFY(InitContextMenuManager()); 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->UpdateWindow(); return TRUE; } 它类似于传统的 MDI 应用程序对象,但有几点值得一提。 首先,子窗口框架的运行时类是CMDIChildWndEx,而非传统的CMDIChildWnd类。要准备在选项卡式视图之间进行切换时使用的菜单管理器,还需调用InitContextMenuManager函数。 下面的代码显示了最小选项卡式MDI框架窗口。同样,你会看到开启此功能是多么地简单。实际只需调用EnableMDITabbedGroups成员函数来启用MDI选项卡式分组功能即可。CMDITabInfo类提供了各种成员变量,可使用它们来自定义选项卡式分组的外观和行为。顾名思义,它甚至还允许用户拖动不同的视图来创建垂直或水平对齐的选项卡组。 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() int 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; } 5.6 编写功能区应用程序 下面通过一个简单的例子,来介绍如何用MFC来创建一个新的功能区(ribbon)应用程序,并在程序中添加自己的界面元素和代码。 此节所对应的英文帮助文档,位于VS08SP1的MSDN帮助系统的“目录/开发工具和语言/Visual 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应用程序”项,在下边的“位置”栏选择新项目目录的父目录所在的路径(如E:\),在“名称”栏中键入你的程序项目名(如Rib),不选中“创建解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 的目录”选项,按“确定”钮。参见下图: · 在弹出的“MFC应用程序向导”对话框的欢迎页中,按“下一步”按钮或单击左栏中的“应用程序类型”项,进入该对话框的“应用程序类型”页。 · 在“应用程序类型”页右边中部的“视觉样式和颜色”栏的下拉式列表中,选中“Office 2007(蓝色主题)”条目,其余的保持缺省设置不变。参见下图: · 单击左栏中的“用户界面功能”项,进入“MFC应用程序向导”对话框的“用户界面功能”页。 · (重要步骤)在“用户界面功能”页中,选中左边“命令栏”下部的“使用功能区”单选项。参见下图: · 按“下一步”钮或单击左边的“高级功能”项,进入“高级功能”页。为了简单起见,我们这里去选右边“高级框架窗格”栏中的所有复选框。参见下图: · 按“完成”钮关闭“MFC应用程序向导”对话框,向导会自动生成对应的项目。 · 编译运行此项目,结果如下图所示: 可见,向导为我们的应用程序自动创建了一个功能区,含有一个功能区类别(ribbon category)选项卡(tab),称为主要(Home)。该功能区(类别)包含三个功能区面板(ribbon panel)分别叫做剪贴板(Clipboard)、视图(View)和窗口(Window)。 应用程序(功能区)的其他菜单见下列图示: 应用程序大图标的菜单 自定义快速访问工具栏菜单 样式菜单 2.添加功能区类别到功能区 由项目创建的现存功能区对象位于CMainFrame类的头文件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 sizeLargeImage=CSize(32, 32) 3, // 大图片的尺寸,缺省为32*32 int nInsertAt=-1, // 插入位置序号,缺省值-1表示添加到已有功能区类别的后面 CRuntimeClass* pRTI=NULL // 指向运行类的指针 ); 在CMainFrame类的OnCreate函数的中部,有如下两行代码: m_wndRibbonBar.Create(this); // 创建功能区控件 InitializeRibbon(); // 初始化(定制)功能区 在CMainFrame类的InitializeRibbon函数的底部,添加如下代码: // 添加“定制”类别: 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是我们自己在项目的串表(String Table)资源中增加的新类别名串“定制(&C)”的ID;而IDB_FILESMALL和IDB_FILELARGE则为已有的小和大文件图片资源的ID。 编译运行修改后的项目,结果是功能区中新增加了(空的)“定制”类别,如下图所示: 3.添加功能区面板到功能区类别 一个功能区面板(ribbon pane)内含有一组逻辑相关的元素(item)。为了添加功能区面板到功能区类别,你可以使用CMFCRibbonCategory类的AddPanel method函数: CMFCRibbonPanel* AddPanel( LPCTSTR lpszPanelName, // 面板名 HICON hIcon=0, // 图标句柄,用于快速访问工具条 CRuntimeClass* pRTI=NULL // 指向运行类的指针 ); 例如,在CMainFrame类的InitializeRibbon函数的底部,在你刚才的添加功能区类别的代码后,添加如下代码: // 创建并添加喜爱面板: strTemp.LoadString(IDS_RIBBON_FAVORITES); CMFCRibbonPanel* pPanelFavorites = pCategoryCustom->AddPanel(strTemp, m_PanelImages.ExtractIcon(15)); 其中,IDS_RIBBON_FAVORITES是我们自己在项目的串表资源中增加的新面板名串“喜爱”的ID;m_PanelImages为项目创建时自动定义的一个CMFCToolBarImages类对象,已经装入了项目中已有的位图资源IDB_BUTTONS(对应的位图文件为res\ buttons.bmp,含有27个图标): 参见InitializeRibbon函数顶部处的代码: // 加载面板图像: m_PanelImages.SetImageSize(CSize(16, 16)); m_PanelImages.Load(IDB_BUTTONS); CMFCToolBarImages类的ExtractIcon成员函数: HICON ExtractIcon( int nIndex ); 的功能是从工具条位图中提取指定序号的图片,并返回对应图标的句柄。 编译运行,结果如下图所示: 可见,在功能区的“定制”类别选项卡的左边,出现了一个“喜爱”面板。 4.添加元素到功能区面板 为了添加元素到上一步所创建的面板里,可以调用CMFCRibbonPanel类的Add方法: virtual void Add( CMFCRibbonBaseElement* pElem ); 其中的CMFCRibbonBaseElement类,是所有能被添加到面板中的元素(如按钮、复选框、和组合框等)的基类。 我们首先添加一个“打印”按钮,它将具有一个子菜单,包含一个(使用缺省打印机打印的)“快速打印”命令。这两个命令都已经被定义在此应用程序的应用程序大图标的菜单中。 在CMainFrame类的InitializeRibbon函数的底部,在你刚才的添加功能区面板的代码后,添加如下代码: // 创建“快速打印”按钮: strTemp.LoadString(IDS_RIBBON_PRINT_QUICK); CMFCRibbonButton* pBtnFavPrintQuick = new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7); 其中,ID为IDS_RIBBON_PRINT_QUICK的字符串(“打印”)已经被定义在串表资源String Table中了,对应于ID_FILE_PRINT_DIRECT菜单命令。“快速打印”按钮的图标是ID为IDB_FILESMALL的位图资源(对应于位图文件res\filesmall.bmp): 中的第8个(序号为7)。 这里所用的CMFCRibbonButton类的构造函数原型为: CMFCRibbonButton( UINT nID, // 按钮所对应的菜单项ID LPCTSTR lpszText, // 按钮上的文本串 int nSmallImageIndex=-1, // 父类别的图像列表中按钮的小图像序号 int nLargeImageIndex=-1, // 父类别的图像列表中按钮的大图像序号 BOOL bAlwaysShowDescription=FALSE // 是否始终显示描述串 ); 接着,我们使用CMFCRibbonButton类的AddSubItem方法,来添加“快速打印”按钮作为“打印”按钮的子项(subitem)。为此,可在前面所加的创建“打印”按钮的代码后面,再添加如下代码: // 创建带有“快速打印”子项的“打印”按钮: strTemp.LoadString(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); 编译运行的结果为: 可见,功能区的“定制”类别中的“喜爱”面板的顶部出现了一个“打印”按钮,并且该按钮下还有一个“快速打印”子项。 我们准备添加到“喜爱”面板的第二个元素是一个组合框,为了简单起见,该组合框中的条目不再与任何菜单命令项关联。功能区的组合框类为CMFCRibbonComboBox,其构造函数的原型为: CMFCRibbonComboBox( UINT nID, // 命令ID BOOL bHasEditBox=TRUE, // 是否可编辑 Int nWidth=-1, // 组合框的宽度,-1表示使用120像素的缺省宽度 LPCTSTR lpszLabel=NULL, // 组合框的标签串 Int nImage=-1 // ); 下面的代码(添加
本文档为【MFC功能包】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_127872
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:33
分类:互联网
上传时间:2013-01-17
浏览量:28