2.2 MFC的基本概念及应用程序框架
应用程序框架是一个集合,其可以提供一般应用程序所需的全部面向对象软件组件。或者说,一个应用程序框架是一个类库的超级集合。一个应用程序框架不同于单纯的类的集合,其自己定义了程序的结构。
比如奔驰汽车的生产厂家,其可以生成所有的奔驰汽车的零件,并有其自己的生产线,那么这个厂家就是一个应用程序框架。在这个框架中,可以生产出很多型号的奔驰汽车,如图2-5所示。
图2-5 应用程序框架
在介绍使用MFC(Microsoft Fundation Classes,微软基础类库)应用程序框架开发Windows应用程序后,读者可将传统Windows的编程方法与MFC框架进行对比。
2.2.1 MFC的基本概念
MFC即微软基础类库,其位于任何Windows API之上。在这个类库中包含了一百多个程序开发过程中最常用到的类,大多数的MFC类都是直接或间接从CObject类派生出来的,CObject类是MFC类库的基类。形象地说,MFC就是一个人才管理中心,其中有许许多多掌握了各种技能的人,有工程师、教师、医生等。当社会需要某种技能的人时,就从该MFC中取出并应用到环境中,如图2-6所示。
图2-6 MFC
近年来,面向对象技术无论在理论上还是实践上都在飞速发展。面向对象技术中最重要的就是“对象”的概念。它把现实世界中的人、机器等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如人的体重、机器的体积等,而方法是指对象本身所能执行的功能,如人能行走、机器能运作等。
对于有过SDK编程经历的开发者,一定会对其烦琐的编程方式和大量的API调用颇有感触。而MFC类库通过将API函数进行分类封装,大大简化了编程的难度,利用MFC进行Windows程序开发,只需要进行少量的工作便能完成相同的任务。同时,MFC编程还具有C++编程的所有优点,例如继承和封装。正是由于MFC编程方法充分利用了面向对象技术的优点,使得用户在编程时极少需要关心对象方法的实现细节,而只需简单地调用已有对象的方法就可以了。
当MFC类库中的类方法不能满足用户需求时,可以利用面向对象中的继承方法从类库中的已有类派生出自己需要的类。这些派生出来的类除了具有基类的所有特性和功能外,还可以根据需要添加新的属性和方法。这使得应用程序中程序员所需要编写的代码大为减少,从而有力地保证了程序良好的可调试性。MFC不仅给用户提供了Windows图形环境下应用程序的框架,还提供了创建应用程序的组件。
简单地说,MFC的优点可归结为以下几点。
● MFC是C++的Microsoft Windows应用程序编程接口。
● MFC开发的应用程序使用了标准化的结构。
● 使用MFC开发的应用程序不仅小,而且运行快。
● Visual C++工具降低了编码的复杂性。
● MFC库功能丰富(具体功能请参见MFC相关资料)。
说明
MFC中封装的对象都是Windows程序设计中常用的对象。此外,读者可以对其中的对象进行继承,从而派生出符合用户要求的更具体的对象。
2.2.2 使用应用程序向导创建MFC应用程序框架
在第1章创建第一个Windows程序“Hello World”时,读者已经了解了使用AppWizard创建应用程序的大概步骤。为了使读者更好地理解MFC应用程序框架的优势,本节将通过图例具体介绍使用AppWizard应用程序向导生成一个MFC应用程序框架的每一个步骤。
【范例2-1】该实例生成一个应用程序窗体,有菜单栏、工具栏、状态栏、最大化、最小化、关闭等窗口的基本组成部分。
1 启动Visual C++ 6.0。在【File】菜单中单击【New】命令,打开【New】对话框,如图2-7所示。在该窗体中选择【Projects】选项卡,然后在左侧窗口选择【MFC AppWizard[exe]】选项,在右侧的【Project Name】(项目名)文本框中为新建的项目输入一个名称,如Test。
图2-7 新建MFC应用程序
2 单击【OK】按钮,弹出【MFC AppWizard - Step1】对话框,如图2-8所示。在该对话框中,用户可以选择生成哪种类型的应用程序,可供选择的类型有如下三种。
图2-8 选择应用程序框架
● 单文档(Single document):选择该单选按钮,应用程序会生成一个单文档/视图应用程序框架。
● 多文档(Multiple documens):选择该单选按钮,应用程序会生成一个多文档/视图应用程序框架。
● 基于对话框(Dialog based):选择该单选按钮,应用程序会生成一个基于对话框的应用程序框架。
这里选择【Single document】单选按钮,建立单文档/视图应用程序框架,其他的按默认设置。
提示
图2-8中的复选框【Document/View architecture support】表示是否支持文档/视图查看体系结构,一般选中该复选框。
3 单击【Next】按钮,弹出【MFC AppWizard - Step 2 of 6】对话框,如图2-9所示。该步骤询问用户应用程序是否支持数据库。数据库支持的类型有如下4种。
图2-9 选择数据库支持
● 无数据库(None):默认选项。
● 仅支持头文件(Header files only):指定支持文档和视图中存储数据库或记录集对象。
● 不支持文件的数据库(Database view without file support):指定数据库和多记录集,无序列化,若只访问数据库信息而无须写回,则选择此项。
● 文件支持的数据库(Database view with file support):完全数据库支持,包括序列化和与文档相关的菜单命令,即可以读写数据库。
这里选择【None】单选按钮,即不需支持数据库。
4 单击【Next】按钮,弹出【MFC AppWizard - Step 3 of 6】对话框,如图2-10所示。该步骤询问用户应用程序支持何种复合文档。复合文档支持的各选项功能如下。
图2-10 选择复合文件支持
● 无复合文档支持(None):即无OLE(Object Linking and Embedding,对象链接与嵌入)支持。
● 容器支持(Container):将对象嵌入或链接到文档,以便用户编辑。
● 袖珍服务器(Mini-server):表示应用服务可创建和管理复合文档对象,但不能独立运行且仅支持嵌入项。
● 完全服务器(Full-server):表示应用程序可创建和管理复合文档对象,能够独立运行,并且支持链接项的同时支持嵌入项。
● 容器/完全服务器(Both container and server):表示应用程序既可以是容器,又可以是服务器。容器是可将链接项或嵌入项并入自己文档中的应用程序。服务器是可创建供容器应用程序使用的自动化项的应用程序。
一般来说,选择【None】单选按钮即可,其他按默认设置。
说明
当用户选中后两个选项中的其中一个后,【Data Source】按钮变为可用,单击该按钮可为应用程序选择关联数据的类型、驱动程序和数据源等,这些将在后续章节详细介绍。
5 单击【Next】按钮,弹出【MFC AppWizard - Step 4 of 6】对话框,如图2-11所示。该步骤询问用户生成何种特征的应用程序:增加一个工具栏(Docking toolbar),增加一个状态栏(Initial status bar),生成打印和预览命令的代码(Printing and print preview),生成支持上下文相关帮助的帮助文件(Context-sensitive Help),支持三维效果(3D controls),使应用程序能够创建、操作、传输和存储邮件消息(MAPI Messaging API),支持Windows Sockets。一般来说,建议这里所有的选项都采用默认的设置。
图2-11 选择应用程序界面
6 单击【Next】按钮,弹出【MFC AppWizard - Step 5 of 6】对话框,如图2-12所示。该步骤询问工程的样式、是否生成源文件注释及怎样使用MFC类库,一般都按默认设置。
图2-12 选择工程样式、源文件注释和MFC库使用方式
7 单击【Next】按钮,弹出【MFC AppWizard - Step 6 of 6】对话框,如图2-13所示。该步骤对话框中的默认设置确定了类的名称及其所在文件的名称。用户可以自主更改名称,但建议使用向导自动生成的名称,这样更易于区分。
图2-13 确定类和文件名称
8 单击【Finish】按钮,弹出【New Project Information】对话框,如图2-14所示。该对话框主要显示创建的文件清单。最后单击【OK】按钮,即可完成一个应用程序框架的创建。
图2-14 显示创建文件清单
提示
在Visual C++ 6.0中,AppWizard向导允许读者选用MFC类库中其他视图类作为应用程序视图类的基类。不一定非要是默认的CView类,可以改成CEditView类。这里全部采用默认设置。
【运行结果】通过上述步骤,已经生成一个使用MFC基本类库的应用程序基本框架(单文档/视图结构的应用程序框架)。该框架可以运行,结果如图2-15所示。
图2-15 运行基本框架
【范例解析】该范例运行之后,读者会发现这个应用程序框架具备Windows程序的所有特性,菜单栏、工具栏、状态栏、图标甚至还有关于对话框、打印预览等,这就是AppWizard通过MFC动态创建的一个应用程序框架。
在该范例中,读者不需从第一个步骤依次执行到最后一个步骤。如果读者在后续步骤中的设置均使用默认设置,那么可以在第二个步骤中直接单击【Finish】按钮结束向导。
从上述步骤可以看出,用Visual C++ 6.0中MFC设计Windows应用程序的便捷,用户还可以根据不同的应用选择不同的选项。至此,一个最简单的Windows应用程序就创建好了。
提示
如果需要在该窗体的第一行和第一列中显示文字,如“Hello World!”,只需找到OnDraw成员函数,输入“pDC->TextOut(0,0," Hello World!");”代码即可。
相比Win32编程而言,WinMain函数都不见了。事实上,WinMain函数并没有不见,也不是Windows程序结构发生了变化,这都是MFC的效果。在该应用程序框架的底层仍然采用的是WinMain函数和WndProc回调函数,只是其被MFC封装在各个类中了,然后MFC通过应用程序向导生成了这些类,用户向这个类添加一些内容即可,如重载函数、消息处理函数等。
读者可以看到,在Windows编程中,MFC程序框架就好比是一座大楼的主梁。主梁都有后,程序员所要做的就是添砖加瓦。而在Win32程序中,甚至主梁都要程序员自己搭建,这样做的效率是非常低的。因此,使用MFC进行Windows程序设计是非常方便的。