文档库 最新最全的文档下载
当前位置:文档库 › 15MFC功能包编程简介

15MFC功能包编程简介

15MFC功能包编程简介
15MFC功能包编程简介

第15章 MFC功能包编程简介

为了与苹果公司于2001年3月推出的Mac OS X的水(Aqua)界面竞争,微软公司于2006年11月先后推出了具有Aero(气)新用户界面的Windows Vista和使用了流畅(Fluent)用户界面(其主体是功能区[ribbon])的Office 2007。VC08 SP1中的MFC功能包则提供了对具有Aero界面和功能区应用程序的编程支持。

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)、视觉样式切换(换肤)、可停靠与自动隐藏的控制条和窗格等。

在VS10中,MFC功能包已被完全并入MFC 10.0内,并在工具箱中增加了若干新型MFC控件工具,还增加了功能区的可视交互编程功能,这些在原来VS08 SP1所带的MFC 功能包中是没有的。与MFC功能包相关的帮助文档和其他MFC的一样,都位于MSDN的“目录\开发工具和语言\Visual Studio文档\Visual C++\参考信息\Libraries Reference\MFC”,主要内容在其“Classes”子目录中(而在VS08 SP1的MSDN中则是位于另外的单独目录中)。

15.1 新增功能

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

15.1.1 传统界面元素的改进

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

在功能包中增了微软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)。

15.1.2 新界面元素

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

窗格(Panes)是一种窗口,通常是可调整大小、可移去和可停靠的,参见图15-1。窗格支持如下功能:MS Office样式的对话框条、(支持图片和停靠的)Office样式的菜单条,MS Outlook样式的快捷条(shortcut bar)、标题条(caption bar)和任务窗格(task pane),(类似于工具条、属性和浏览器窗格)Visual Studio样式的窗格。窗格还支持(内容和位置在应用程序的多次运行之间持续不变的)钢筋(Rebar)控件、(支持图标、动画和进度条)状态条和打印预览服务。

图15-1 VC10生成的具有多个窗格的默认(选项卡式MDI)MFC应用程序的界面

2.功能区控件

功能区(ribbon,缎丝带/带状条)是微软公司从Office 2007开始引新的Microsoft Office Fluent(流畅)用户界面的一部分,用来同时代替传统的菜单、工具条和用户对话框功能,可视为扩展的可视化菜单与设置对话框的集成,参见图15-2。

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

从概念上讲,功能区由多个被称为类别(category)的选项卡(tab)组成,每个选项卡上都有一组面板(panel),每个面板又包含若干功能区元素或控件,它们分别代表特定于应用程序的各种操作(似传统的菜单项和工具条按钮)。如果功能区包含有应用程序按钮(左上角的大圆按钮),则在用户单击应用程序按钮时所显示的弹出窗口中也会显示一个面板,它被视为功能区的主类别。

图15-2 包含功能区的Office 2010的界面

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

编写功能区应用程序的具体方法,将在后面的15.4节中介绍。

3.选项卡窗口

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

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

默认的MFC(功能包)应用程序,就具有(与Visual Studio类似的)多窗格和MDI选项卡组界面,参见图15-1。

编写多窗格应用程序的具体方法,将在后面的15.5节中介绍。

15.1.3 新增功能

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

1.桌面报警

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

2.定制

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

3.可视化

MFC10.0提供了可视化(visualization)管理器,它按照用户选择的视觉样式来绘制控件。可视化支持的视觉样式有:Windows本机/默认、Microsoft Office 2003/2007、Visual Studio 2005/2008和Windows 7。

4.特殊功能

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

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

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

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

灵巧(Smart)——在拖动窗口期间画窗口的内容,而且有一组箭头标记指出窗口可停靠的位置(如Visual Studio 2005/2008/2010)。

15.2 界面的切换与定制

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

15.2.1 视觉样式切换

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

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

图15-4 Visual Studio 2008视觉样式

在应用程序的“视图”菜单中有一个“应用程序外观”子菜单,其中包含如下菜单项:Windows 2000、Office XP、Windows XP、Office 2003、Visual Studio 2005、Visual Studio 2008(默认值)、Office 2007(蓝色样式、黑色样式、银色样式、水绿色样式),参见图15-5。

图15-5 应用程序外观菜单

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

Windows XP Office 2003

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

图15-6 部分视觉样式

15.2.2 自定义设置

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

图15-7 “自定义”菜单项

a)“命令”页b)“工具栏”页

c)“键盘”页d)“菜单”页

e)“选项”页

图15-8 “自定义”对话框的设置页

1.增删工具栏按钮

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

图15-9 “添加或删除按钮”菜单中的“标准”子菜单

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

2.新建工具栏

利用“自定义”对话框的“工具栏”页(参见图15-8 b)),可以在运行时为应用程序动态创建新的工具栏,并在其中增加若干(菜单项或)按钮。具体的做法是:

●在对话框中按“新建”钮,在弹出的“工具栏名称”对话框(参见图15-10 a))中输

入新工具栏的名称,如“编辑”,按“确定”关闭此对话框。此时,会弹出一个浮动的空工具栏,参见图15-10 b)。

a)“工具栏名称”对话框b) 空工具栏c) 添加若干菜单项按钮

图15-10 新建工具栏

●利用“自定义”对话框的“命令”页,向空工具栏中添加若干菜单项按钮,如“编

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

图15-11 停靠新工具栏到标准工具栏下

3.设置快捷键

利用“自定义”对话框的“键盘”页,用户可以在运行时为应用程序动态添加菜单项对

应的快捷键。具体做法是,在对话框中左上部的“类别”栏的下拉式列表中选择一菜单(如“文件”),在其下的“命令”栏的列表中选择一菜单项(如“打印预览”),定位于对话框中下部的“按新快捷键”栏下的文本编辑框,按快捷键组合键(如Ctrl+R),再按对话框中的“分配”钮完成操作,参见图15-10。

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

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

4.切换菜单

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

图15-11 利用“自定义”对话框的“菜单”页切换菜单

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

5.编辑上下文菜单

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

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

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

图15-12 利用“自定义”对话框的“菜单”页编辑上下文菜单

6.工具栏和菜单选项

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

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

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

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

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

15.3 应用程序架构

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

15.3.1 类层次结构

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

为了能支持新图形用户界面,VC08的MFC功能包增加了这些基类的扩展版(参见图15-15中部),如应用程序类C*App的基类是从CWindApp派生的CWindAppEx类、单文档应用程序的主框架窗口类CMainFrame的基类是从CFrameWnd派生的CFrameWndEx类、多文档应用程序的主框架窗口类CMainFrame的基类是从CMDIFrameWnd派生的CMDIFrameWndEx类、多文档应用程序的子框架窗口类CChildFrame的基类是从CMDIChildWnd派生的CMDIChildWndEx类。文档类和文档模板类则没有变化。

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

图15-15 MFC应用程序项目(Test)中的主要类及其基类

15.3.2 最小功能包应用程序

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

似2.4.2中的最简单的MFC程序,需先创建一个名为Min的“Visual C++/Win32”的“Win32项目”,在其“应用程序设置”页中的“附加选项”栏中,选中“空项目”。并修改项目属性中的“配置属性/常规”页中的“项目默认值”栏的“MFC的使用”为“在静态库中使用MFC”或“在共享DLL中使用MFC”。然后将下面的最小VC08 MFC功能包应用程序的具体代码之CPP文件添加到该项目中(运行结果如图15-16所示):

// Min.cpp

#include

#include

#include

class CMainWindow : public CFrameWndEx {

public:

CMainWindow();

};

CMainWindow::CMainWindow() {

Create(NULL, //class name

L"最小功能包应用程序"); //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;

15.3.3 选项卡式多文档界面

MFC一直都支持MDI 实现及其文档/视图体系结构,但图15-17 a)中所示的传统MDI 早已过时,用户可能会认为你的应用程序从Windows 95开始就再也没有更新过。现在,绝大多数用户都期望可通过窗口边缘的选项卡来访问多个文档,而这正是新的CMDIFrameWndEx MDI框架窗口所提供的功能,参见图15-17 b)。

a) 传统MDI b) 选项卡式MDI

图15-17 多文档界面的MFC应用程序

我们需要更新多文档/视图应用程序对象以支持新的框架窗口。下面的代码显示了满足需要的最小选项卡式MDI应用程序对象。

class CMyApp : public CWinApp Ex {

DECLARE_MESSAGE_MAP()

public:

virtual BOOL InitInstance();

};

BEGIN_MESSAGE_MAP(CMyApp, CWinAppEx)

ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)

图15-16 最小功能包应用例

END_MESSAGE_MAP()

BOOL CMyApp::InitInstance() {

SetRegistryKey(L"SampleCompany\\SampleProduct");

VERIFY(InitContextMenuManager());

AddDocTemplate(new CMultiDocTemplate(IDR_CHILDFRAME,

RUNTIME_CLASS(Document),

RUNTIME_CLASS(CMDIChildWnd Ex),

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 CMDIFrameWnd Ex {

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;

}

15.4 编写功能区应用程序

功能区(ribbon)用于代替传统的菜单、工具条和部分对话框的功能,是微软公司推崇的新图形界面。MFC功能包提供了对功能区界面的支持,但是却没有提供功能区资源的交互式设计界面。新推出的Visual C++ 2010(MFC 10.0)已经弥补了这一缺陷。

本节通过一个非常简单的例子,初步介绍功能区应用程序的交互式可视编程方法。此节内容所对应的英文帮助文档,位于MSDN帮助系统的“库主页/Visual Studio 2010/Visual Studio/Visual Studio 语言/Visual C++/Visual C++ 参考/Visual C++ 类库/MFC Reference/ Walkthroughs (MFC)”的“Walkthrough: Creating a Ribbon Application By Using MFC”之中。

编写功能区应用程序的主要步骤为:

15.4.1 创建功能区应用程序项目

利用“起始页”的“新建项目”项打开“新建项目”对话框,选中“Visual C++\MFC”

的“MFC 应用程序”模板,输入项目名串“Rib”,按“确定”钮,参见图15-18。

图15-18 创建新项目

●在打开的“MFC应用程序向导”对话框中,切换到“应用程序类型”页,在右上

部的“项目类型”栏中选中“Office”单选钮,其余保持不变,参见图15-19。

图15-19 选择项目类型

●切换到“用户界面功能”页,保持默认的选中“使用功能区”单选钮不变,参见图

15-20。

●切换到“高级功能”页,去选所有“高级框架窗格”复选框,参见图15-21。

图15-21 去选“高级框架窗格”复选框

●按“完成”钮,创建项目。

●编译后运行的结果如图15-22所示。

15.4.2 打开功能区编辑器

在项目区切换到“资源视图”,展开资源窗口中的“Rib.rc”及“Ribbon”子项,双击里

相关文档