《VC03 MFC编程基础.pdf》由会员分享,可在线阅读,更多相关《VC03 MFC编程基础.pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 本文由失落的街区贡献 d o c 1。Vi s u a l C+程序设计 03:MFC 编程基础 程序设计:3.1 MFC 概述 微软基本类库 MFC(Mi c r o s o f t Fo u n d a t i o n Cl a s s)是微软公司为 Wi n d o w s 程序员提供的 一个面向对象的 Wi n d o w s 编程接口,它大大简化了 Wi n d o w s 编程工作。使用 MFC 类库进 行 Wi n d o w s 应用程序开发具有很大的优越性。首先,MFC 提供了一个标准化的结构,这样,开发人员不必从头设计创建和管理一个标准 Wi n d o w s 应用程序
2、所需的程序,而是“站在巨 人肩膀上”,从一个比较高的起点编程,因而节省了大量的时间;其次,它提供了大量现成 的代码,并通过向导(应用程序向导 App Wi z a r d 和类向导 Cl a s s Wi z a r d)指导用户编程时实 现某些技术和功能。MFC 类库充分利用了 Mi c r o s o f t 开发人员多年开发 Wi n d o w s 程序的经 验,并可以将这些经验融入到你自己开发的应用程序中去。对用户来说,用 MFC 开发的最终应用程序具有标准的、熟悉的 Wi n d o w s 界面,这样的 应用程序易学易用;另外,新的应用程序还能立即支持所有标准 Wi n d o
3、w s 特性,而且是用 普通的、明确定义的形式。事实上,也就是在 Wi n d o w s 应用程序界面基础上定义了一种新 的标准MFC 标准。早期,在开发 Wi n d o w s 应用程序时必须使用微软的 SDK,直接调用 Wi n d o w s API 函数。由于 Wi n d o w s API 的数目非常多,编写 Wi n d o w s 应用程序不仅需要记住很多 API 函数,而 且要小心谨慎地处理程序中的每一个细节。MFC 按照面向对象的原理把这些浩繁的 Wi n d o w s API 按逻辑组织起来,使它们具备了抽象化、封装、多态性和模块化的性质。1989 年,微软建立了
4、Ap p l i c a t i o n Fr a m e w o r k(AFX)小组,负责开发和 Bor l a n d 公司的 应用程序框架 OWL(Ob j e c t Wi n d o w s La n g u a g e)相类似的应用程序框架。OWL 是 Bo r l a n d 公司为 Wi n d o w s 程序员开发的一个类库,在当时非常成功。AFX 小组最初的目标是利用最新的面向对象的技术来开发用于编写 Wi n d o w s GUI 程序 的工具和类库。他们采用自顶向下的设计方法,逐步将对象抽象出来。然后,他们试着花了 几个月时间用这个类库来编写应用程序,结果发现这个
5、类库偏离 Wi n d o w s API 实在太远,过分的抽象并没有太大的实用性,反而大大降低了应用程序的效率。于是,他们放弃了整个 AFX 类库,对类库重新进行设计。他们采用了自底向上的方法,从已有的 Wi n d o w s API 着手,将类建立在 Wi n d o w s API 对象基础上,设计出后来成为 MFC 1.0 的一个类库。我们可以在以后的学习中看到,很多类中的成员函数基本上是和 Wi n d o w s API 一一对应的。同时,我们也可以看到在 MFC 中的 AFX 时期的痕迹,许多源程序文件有 a f x 前缀,如 a f x a b o r t.c p p、a f
6、 x m e m.c p p 等。MFC 延用了许多 AFX 类库的宏,因此我们经常 会看到以 AFX 开头的宏以及以 Af x 开头的全局函数。3.2 MFC 中类的组织结构和常用类 3.2.1 MFC 中类的组织结构 目前的 MFC 版本中包含了 100 多个类,不同的类实现不同的功能,类之间既有区别又 有联系。MFC 同时还是一个应用程序框架,它帮助定义应用程序的结构,以及为应用程序 处理许多杂务。事实上,MFC 封装了一个程序操作的每一方面。在 MFC 程序中,程序员很 少需要直接调用 Wi n d o w s API 函数,而是通过定义 MFC 类的对象并调用对象的成员函数来 实现相
7、应的功能。MFC 类库中类是以层次结构的方式组织起来的。几乎每个层次结构都与一个具体的 Wi n d o w s 实体相对应,一些主要的接口类管理了难以掌握的 Wi n d o w s 接口。这些接口包括:窗口、GDI 类、对象链接和嵌入类(OLE)、文件类、对象 I/O 类、异常处理类以及集合类 等。MFC 类库中的类按层次关系可划分为如下若干个类:(1)根类:COb j e ct。(2)应用程序体系结构类:包括应用程序和线程支持类、命令相关类、文档类、视图 类、框架窗口类、文档模板类等。(3)窗口、对话框和控件类:包括框架窗口类(窗口)、视图类、对话框类、控件类、控制条类等。(4)绘图和打
8、印类:包括输出(设备相关)类、绘图工具类等。(5)简单数据类型类。(6)数组、列表和映像类:包括数组类、列表类、映像类等。(7)文件和数据库类:包括文件 I/O 类、DAO 类、ODBC 类等。(8)In t e r n e t 和网络工作类:包括 ISAPI 类、Wi n d o ws So c k e t 类、Wi n 32 In t e r n e t 类等。(9)OLE 类:包括 OLE 容器类、OLE 服务器p a g e 1类、OLE 拖放和数据传输类、OLE 普通 对话框类、OLE 动画类、OLE 控件类、活动文档类、其他文档类。(10)调试和异常类:包括调试支持类、异常类。除了
9、上述的一些类之外,在 MFC 中还包含一些宏、全局变量和全局函数。下面将简单介绍 MFC 中一些主要的类和某些子层次结构。3.2.2 COb j e c t 类 从继承关系来看,又可将 MFC 中的类分成两大类,占大多数的一些类是从 COb j e c t 继 承下来,另一些类则不是从 COb j e c t 类继承下来,这些类包括:字符串类 CSt r i n g、日期时 间类 CTi m e、矩形类 CRe c t、点 CPo i n t 等,它们提供程序辅助功能。COb j e c t 类是 MFC 的抽象基类,是 MFC 中多数类和用户自定义派生类的基类,它为程 序员提供了许多编程所需
10、的公共操作。这些操作包括:对象的建立和删除、序列化支持、对 象诊断输出、运行时信息以及集合类的兼容等。序列化是对象本身往返于存储介质的一个存储过程。序列化的结果是使数据“固定”在存储介质上。COb j e c t 类定义两个在序列化操作中起重要作用的成员函数:Se r i a l i z e 和 Is Se r i a l i z a b l e。程序可以调用一个由 COb je c t 派生的对象的 Is Se r i a l i z a b l e 函数来确定该对象 是否支持序列化操作。建立一个支持序列化操作的类的步骤之一是重载继承自 COb j e c t 类的 Se r i a l i
11、 z e 函数,并提供序列化数据成员的派生类的专用代码。COb j e c t 的派生类还支持运行时类型信息。运行时的类型信息机制允许程序检索对象的 类 名 及 其 他 信 息。COb j e c t 提 供 两 个 成 员 函 数 来 支 持 运 行 时 类 型 信 息:Is Ki n d Of 和 Ge t Ru n t i m e Cl a s s。函数 Is Ki n d Of 指示一个对象是否属于规定类或者是从规定的类中派生出 来的。Ge t Ru n t i m e Cl a s s 类对象中包含了一个类运行时的信息,包括这个类的类名、基类名 等信息,通过它可以很容易地获得一个指定
12、类的运行时刻信息。MFC 提供了许多诊断特性,使用 CDu m p Co n t e x t 类与 COb j e c t 的成员函数 Du m p 配合,可以在调试程序时输出对象内部数据;在派生类中重载基类的 As s e r t Va l i d 成员函数,可以 为派生类的对象提供有效性检查。3.2.3 应用程序体系结构类 该类用于构造应用程序框架的结构,它能提供多数应用程序公用的功能。编写程序的 任务是填充框架,添加应用程序专用的功能。应用程序体系结构类主要有与命令相关的类、窗口应用程序类、文档视图类和线程基类等。1、命令相关类:CCm d Ta r g e t 类 该类是 COb j
13、ec t 的子类,它是 MFC 库中所有具有消息映射属性类的基类。消息映射规 定了当一对象接收到消息命令时,应调用哪一个函数对该消息进行处理。程序员很少需要从 CCm d Ta r g e t 类中派生出新类,通常从其派生类进行派生,如窗口类(CWn d)、应用程序类(CWi n Ap p)、文档模板类(CDo c Te m p l a t e)、文档类(CDo c u m e n t)、视图类(CVi e w)及 框架窗口类(CFr a m e Wn d)等。2、窗口应用程序类:CWi n Ap p 类 每个应用程序只有一个应用程序对象。在运行程序中该对象与其它对象相互协调,它 是从 CWi
14、 n Ap p 类派生出来的。CWi n Ap p 类封装了初始化、运行、终止应用程序的代码。3、文档视图类 文档对象由文档模板对象创建,管理应用程序的数据。视图对象表示一个窗口的客户 区,显示文档数据并允许用户与之交互。这些模板及基类有:CDo c Te m p l a t e:文档模板基类。文档模板负责协调文档、视图和框架窗口的创建。CSi n g l e Do c Te m p l a t e:单文档应用程序(SDI)的文档模板。CMu l t i Do c Te m p l a t e:多文档应用程序(MDI)的文档模板。CDo c u m e n t:应用程序专用文档的基类。CVi
15、e w:显示文档数据的应用程序专有视图的基类。4、线程基类:CWi n Th r e a d 类 所有线程的基类,可直接使用。CWi n APP 类就是从 CWi n Th r e a d 类派生出来的。3.2.4 可视对象类 1、窗口类:CWn d 类 该类提供了 MFC 中所有窗口类的基本功能。它是 CCm d Ta r g e t 类的派生类。创建 Wi n d o w s 窗口要分两步进行:首先引入构造函数,构造一个 CWn d 对象,然后调用 Cr e a t e 函数创建 Wi n d o w s 窗口。MFC 中还从 CWn d 类派生出进一步的窗口类型以完成更具体的窗 口创建工
16、作,这些派生类有:CFr a m e Wn d:框架窗口类,SDI 应用程序主框架窗口的基类。CMDIFr a m e Wn d:多文档框架窗口类,MDI 应用程序主框架窗口的基类。CMDICh i l d Wn d:多文档框架窗口类,MDI 应用程序文档框架窗口的基类。2、视图类:CVi e w 类 该类表示框架窗口的客户区和显示文档数据并接收输入的客户区,其派生类主要有如 下几种:CSc r o l l Vi e w:具有滚动功能的视图的基类。CFo r m Vi e w:其布局在对话资源中定义的视图类。CEd i t Vi e w:具有文本编辑、查找、替换和滚动功能的视图。3、菜单类:C
17、Me n u 类 该类是 COb je c t 类的子类,用于管理菜单。它提供了与窗口有关的菜单资源建立、修改、跟踪及删除的成员函数。4、对话框类:CDi a l o g 类 对话框是一个特殊的窗口,该类是p a g e 2从 CWn d 类中派生出来的,可用于建立模态对话框 和非模态对话框模型。对话框类的层次结构中包括通用对话框类 CDi a l o g 以及支持文件选 择、颜色选择、字体选择、打印、替换文本的通用对话框,包括:CFi l e Di a l o g:提供打开或保存一个文件的标准对话框。CCo l o r Di a l o g:提供选择一种颜色的标准对话框。CFo n t Di
18、 a l o g:提供选择一种文字的标准对话框。CFi n d Re p l a c e Di a l o g:提供一次查找并替换操作的标准对话框。5、控件类 控件子层次结构包括若干类,使用这些类可建立静态文本、命令按钮、位图按钮、列 表框、组合框、滚动条、编辑框等。这些直观的控件为 Wi n d o w s 应用程序提供了各种输入 和显示界面。主要的控件类如下:CSt a t i c:静态文本控件窗口。常用于标注、分隔对话框或窗口中的其他控件。CBu t t o n:按钮控件窗口。该类为对话框或窗口中的按钮、检查框或单选按钮提供一个 总的接口。CEd i t:编辑控件窗口。编辑控件用于接收用
19、户的文字输入。CRi c h Ed i t:多信息编辑控件。除了编辑控件的功能外,还支持字符和图形格式,以及 OLE 对象。CSc r o l l Ba r:滚动条控件窗口。该类提供滚动条的功能,用做对话框或窗口中的一个控 件,用户可通过它在某一范围内定位。CPr o g r e s s Ba r:进度指示控件窗口,用于指示一个操作的进度。CSl i d e r Ct r l:游标控件窗口。包括一个可移动的游标,用户可移动游标选择一个值。CLi s t Bo x:列表框控件窗口。列表框用于显示一个组列表项,用户可以进行观察和选择。CCom b o Bo x:组合框控件窗口。组合框由一个编辑控件
20、加一个列表框组成。CBi t m a p Bu t to n:带有位图而非文字标题的按钮。CSp i n Bu t t o n Ct r l:带有一个双向箭头的按钮,单击某个箭头按钮可增大或减少值。CAn i m a t e Ct r l:动画显示控件窗口,显示一个简单的视频图像。CTo o l Ti p Ct r l:一个小的弹出式窗口,显示一行文本,描述应用程序中一个工具的作用。CHo t Ke y Ct r l:热键控件窗口,使用户可以创建一个“热键”,以快速地执行某项操作。6、控制条类:CCo n t r o l Ba r 类 控制条的主要表现形式是工具条、状态条、对话条。该类是 CC
21、o n t r o l Ba r、CSt a t u s Ba r 和 CDi a l o g Ba r 的基类,负责管理工具条、状态条、对话条的一些成员函数。7、绘画对象类:CGd i Ob j e c t 类 图形绘画对象的类层次结构以 CGd i Ob j e c t 类为基类,可用于建立绘画对象模型,如画 笔、刷子、字体、位图、调色板等。这些子类有:CBi t m a p:封装一个 GDI 位图,提供一个操作位图的接口。CBr u s h:封装一个 GDI 画刷,可被选择为设备描述表的当前画刷。CFo n t:封装一个 GDI 字体,可被选择为设备描述表的当前字体。CPa l e t
22、t e:封装一个 GDI 调色板,可作应用程序和彩色输出设备(如显示器)之间的接 口。CPe n:封装一个 GDI 画笔,可被选择为设备描述表的当前画笔。CRg n:封装一个 GDI 域,用于操作窗口内的椭圆域或多边形域。该类与 CDC 类的裁 剪成员函数一起使用。8、设备描述表类:CDC 类 该类及其派生类支持设备描述表对象。CDC 类是一个较大的类,包括许多成员函数,如映像函数、绘画工具函数、区域函数等,通过这些成员函数可以完成所有的绘画工作。CDC 类具有如下的子类:CPa i n t DC:显示描述表。用于窗口类的 On Pa i n t 成员函数和视图类的 On Dr a w 成员函
23、数 中,自动调用 Be g i n Pa i n t 进行构造,调用 En d Pa i n t 进行析构。CCl i e n t DC:窗口客户的显示描述表。例如,用于快速响应鼠标事件时进行绘画。CWi n d o w DC:整个窗口的显示描述表,包括客户区和框架区。CMe t a Fi l e DC:Wi n d o w s 元文件的设备描述表。Wi n do w s 元文件包含一个图形设备接口(GDI)命令序列,该序列可被重新执行而创建一幅图像。对 CMe t a Fi l e DC 的成员函数的调 用记录在一个元文件中。3.2.5 通用类 此分类中的类提供了许多通用服务,例如文件 I/
24、O、诊断和异常处理等,此外还包括数 组和列表等集合类。1、文件类:CFi l e 类和 CAr c h i v e 类 如此想编写自己的输入输出处理函数,可以使用 CFi l e 类和 CAr c h i v e 类,一般不必 再从这些类中派生新类。如果使用程序框架,则只需提供关于文档如何将其内容序列化的详 细代码。如下是部分文件类:CFi l e 类:提供访问二进制磁盘文件的接口。CMe m Fi l e 类:提供访问驻内存文件的接口。CSt d i o Fi l e 类:提供访问缓存磁盘文件的接口,通常采用文本方式。CAr c h i v e 类:与 CFi l e 对象一起通过序列化实现
25、对象的永久存存储。2、异常类:CEx c e p t i o n 类 该 类 是 所 有 异 常 情 况 的基 类。程 序 员 只 能 建 立派 生 类 的 对 象,而 不 能直 接 建 立 CEx ce p t i o n 对象。可以使用 CEx c e p t i o n 类的派生类来捕获指定的异常情况。CEx c e p t i on 的 派生类如下:CAr c h i v e Ex c e p t i o n 类:文档序列化异常。CFi l e Ex c e p t i o n 类p a g e 3:有关文件的异常。CMe m o r y Ex c e p t i o n 类:内存不够
26、异常。CNo t Su p p o r t e d Ex c e p ti o n 类:使用未支特征产生的异常。CUs e r Ex c e p t i o n 类:用于停止用户启动的操作异常。3、模板集合类 集合类是指在 MFC 中可以直接被程序员使用的一系列链表、数组和映射类。集合类常 用于包容一组对象,组织文档中的数据,它相当于文档数据的容器。集合类的使用有利于优 化数据结构,简化数据的序列化,保证数据类型的安全性。MFC 中的集合类是模板类,它 们的参数确定了存放在集合中的对象类型。下面是一部分模板集合类。CAr r a y 类:数组集合类,可将元素存储在一个大小动态可变的数组中。CM
27、a p 类:映射集合类,可在该类的对象中保存关键字值对(Ke y-v a l ue p a i r)。CLi s t 类:链表集合类,将元素存储在一双向链表中。CTy p e d Pt r Li s t 类:链表集合类,可将对象指针存储在一双向链表中。CTy p e d Pt r Ar r a y 类:数据集合类,可将对象指针存储在一动态可变的数组中。CTy p e d Pt r Ma p 类:映射集合类,其中保存的键和值均为指标。3.2.6 OLE 类 对象连接与嵌入(OLE)子层次结构为支持 OLE 提供了 9 个类,这 9 个类分为 3 大类:普通类、客户类和服务器类。其中 COl e
28、Do c u m e n t、COl e It e m、COl e Ex c e p t i o n 为支持 OLE 的普通类,COl e Cl i e n t Do c、COl e Cl i e n t It e m 为支持 OLE 的客户类,COl e Se r v e r、COl e Te m p l a t e、COl e Ser v e r Do c、COl e Se r v e r It e m 为支持 OLE 的服务类。这些类提供了支持 OLE 的所有功 能。3.2.7 ODBC 数据库类 开放数据库连接子层次结构提供了一些类来支持 ODBC 特征,即通过这些类可以开发 数据库应
29、用程序来访问多个数据库文件。该层次结构中主要包括的类有:CDa t a Ba s e:封装对一数据源的连接,通过此连接应用程序可在该数据源上进行操作。CRe c o r d s e t:封装从一数据源选出的一个记录集。CRe c o r d Vi ew:提供直接连接一个记录集对象的格式视图。CFi e l d Ex c h a n g e:提供上下文信息,支持记录字段交换,即在字段数据成员、记录对象 的参数数据成员及数据源上的对应列表之间进行数据交换。CLo n g Bi n a r y:封装一存储句柄,用于存储二进制大对象,例如位图等。CDBEx c e p t i o n:对数据存取处理过
30、程中的失败产生的异常。MFC 中的类很多,不可能在这里作更详细的阐述。在使用时,可以参考相关的书籍和 微软帮助系统(MSDN)。3.3 编写一个基于 MFC 的简单应用 编写一个基于 简单应用 3.3.1 创建工程,编辑、编译、运行程序 创建工程,编辑、编译、运行程序 运行 Vi s u a l C+6.0。执行 Fi l e-Ne w 菜单命令,在弹出的 Ne w 对话框中单击 Pr o j e c t s 选项卡,在工程类型 列表中单击 Wi n 32 Ap p l i c a t i o n,在 Pr o j e c t n a m e 编辑框中输入一个工程名,单击 Lo c a t i
31、 o n 编 辑框后边的“”按钮选择工程文件夹存放路径,单击 OK 按钮确认。在接下来弹出的 Wi n 32 Ap p l i c a t i o n St e p 1 o f 1 对话框中,选中“An e m p t y p r o j e c t”后单击 Fi n i s h 按钮,再在后一个对话框中单击 OK 按钮。此时 Vi s u a l C+6.0 为你产生了一 个空的 Wi n 32 工程。执行 Fi l e-Ne w 菜单命令,单击 Fi l e s 选项卡,单击其下文件类型列表中的 C+So u r c e Fi l e,在 Fi l e 编辑框中输入一个文件名,单击 OK
32、按钮,此时对应屏幕右边产生一个空的源 程序编辑窗口。将下列运用 MFC 的 C+源代码拷入源程序编辑窗口:#i n c l u d e c l a s s CHe l l o Ap p:p u b l i c CWi n Ap p p u b l i c:v i r t u a l BOOL In i t In s t a n c e();CHe l l o Ap p t h e Ap p;c l a s s CMa i n Fr a m e:p u b l i c CFr a m e Wn d p u b l i c:CMa i n Fr a m e()/创建主窗口 Cr e a t e(N
33、ULL,我的窗口,WS_OVERLAPPEDWINDOW,CRe c t(0,0,400,300);p r o t e c t e d:a f x _m s g v o i d On LBu t t o n Do w n(UINT n Fl a g s,CPo i n t p o i n t);DECLARE_MESSAGE_MAP();/消息映射入口 BEGIN_MESSAGE_MAP(CMa i n Fr a m e,CFr a m e Wn d)ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()/定义消息映射函数 v o i d CMa i n Fr a m e:O
34、n LBu t t o n Do w n(UINT n Fl a g s,CPo i n t p o i n t)Me s s a g e Bo x(He l l o Wo r l d!,Gr e e t i n g,0);CFr a m e Wn d:On LBu t t o n Do w n(n Fl a g s,p o i n t);/每当应用程序首次执行时都要调用的初始化函数 BOOL CHe ll o Ap p:In i t In s t a n c e()m _p Ma i n Wn d =n e w CMa i n Fr a m e();m _p Ma i n Wn d-Sh o
35、 w Wi nd o w(m _n Cm d Sh o w);m _p Ma i n Wn d-Up d a t e Wi n d o w();r e t u r n TRUE;选择“工程设置”菜单命令,在出现的对话框中选择 Ge n e r a l 标签,然后在 Mi c r o s o f t Fo u n d a t i o n Cl a s s e s 组合框中选择“Us e MFC i n a Sh a r e d DLL”,单击 OK 按钮。执行 Bu i l d-Re b u i l d Al l 菜单命令或单击相应的工具栏按钮进行编译链接。执行 Bu i l d-!Ex e c
36、 u t e 工程名.e x e 菜单命令或单击相应的工具栏按钮运行该程序,p a g e 4 出现 一个空白窗口。单击鼠标左键,弹出一个对话框,其中显示文本“He l l o Wo r ld!”。3.3.2 阅读、理解程序代码 阅读、下面着重讨论 MFC 程序运行机制和消息映射机制来帮助理解 MFC 程序代码。1、从上面的程序例子可以看出,MFC 使用了 a f x w i n.h 来代替头文件 w i n d o w s.h,但在 程序中却看不到 Wi n d o w s 应用程序所必需的程序入口函数 Wi n Ma i n。这是因为 MFC 将它隐 藏在应用程序框架内部了。当用户运行应用
37、程序时,Wi n d o w s 会自动调用应用程序框架内部 的 Wi n Ma i n 函数,并自动查找该应用程序类 CHe l l o Ap p(从 CWi n Ap p 派生)的全局变量 t h e Ap p,然后自动调用 CHe l l o Ap p 的函数 In i t In s t a n c e,该函数会进一步调用相应的函数来完 成主窗口的构造和显示工作。下面来看上述程序中 In i t In s t a n c e 的执行过程。首先执行的是:m p Ma i n Wn d =n e w CMa i n Fr a m e();该语句用来创建从 CFr a m e Wn d 类派生
38、而来的用户框架窗口 CMa i n Fr a m e 类对象,继而 调用该类的构造函数,使得 Cr e a t e 函数被调用,完成了窗口创建工作。然后执行后面两句,用作窗口的显示和更新。m p Ma i n Wn d-Sh o w Wi n d o w(m n Cm d Sh o w);m p Ma i n Wn d-Up d a t e Wi n d o w();最后返回 TRUE,表示窗口创建成功。由于应用程序类 CWi n Ap p 是用来调用 Wi n Ma i n 以及实例的初始化,因此每一个 MFC 应用 程序有且只能有一个这样的应用程序类,且需要一个全局的对象实例,如上述程序中
39、的 t h e Ap p。In i t In s t a n c e 完成初始化工作之后,接下来就是调用基类 CWi n Ap p 的成员函数 Ru n,执 行应用程序的消息循环,即重复执行接收消息并转发信息的工作。Ru n 检查到消息队列为 当 空时,将调用基类 CWi n Ap p 的成员函数 On Id l e 进行空闲时的后台处理工作。若消息队列为 空且又没有后台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。当程 序结束后,调用基类 CWi n Ap p 的成员函数 Ex i t In s t a n c e,完成终止应用程序的收尾工作。2、消息映射 在 MFC 中,一
40、个消息的处理往往是通过独特的 MFC 消息映射机制来进行的。所谓消息映 射(Me s s a g e Ma p)机制,即指 MFC 类中将消息与消息处理函数联系起来,一一对应的机制。这种机制使得应用程序处理消息变得更方便、更直接、更紧凑。在 MFC 中,任何一个从类 CCm d Ta r g e t 派生的类理论上均可处理消息,且得有相应的消息映射函数。按照 MFC 的消息映射机制,映射一个消息的过程是由 3 个部分组成的。在处理消息的类中,使用消息宏 DECLARE MESSAGE MAP 声明对消息映射的支持,并 在该宏之前声明消息处理函数。例如前面示例中的:Pr o t e c t e
41、d:a f x m s g v o i d On LBu t t o n Do w n(UINT n Fl a g s,CPo i n t p o i n t);DECLARE MESSAGE MAP()使用 BEGIN MESSAGE MAP 和 END MESSAGE MAP 宏在类声明之后的地方定义 该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息 MFC 会有不 同的消息映射宏。例如:BEGIN MESSAGE MAP(CMa i n Fr a m e,CFr a m e Wn d)END MESSAGE MAP()其中,BEGIN MESSAGE MAP 带有两个
42、参数,第一个参数用来指定需要支持消息映射的用 户派生类,第二个参数指定该类的基类。定义消息处理函数。例如:v o i d CMa i n Fr a m e;On LBu t t o n Do w n(UINT n Fl a g s,CPo i n t p o i n t)Me s s a g e Bo x(He l l o Wo rl d!,Gr e e t i n g,0);CFr a m e Wn d;On LBu t t o n Do w n(n Fl a g s,p o i n t);注意:为了使该消息能被其他对象接收并处理,在函数中常常需要调用基类中的相关消 息处理函数。综上所述,使
43、用 MFC 不仅可以减少 Wi n d o w s 应用程序的代码量,而且通过消息映射机 制,使消息处理更为方便,并能很好地体现面向对象编程的优点。3.3.3 使用 MFC Ap p Wi z a r d 事实上,在 Vi s u a l C+6.0 中不需要输入上述程序代码,甚至不需要输入一句代码就能 创建所需要的应用程序,这就是 MFC 应用程序向导(MFC Ap p Wi z a r d)的功能。Vi s u a l C+6.0 中的 MFC Ap p Wi z a r d 能为用户快速、高效、自动地生成一些常用的标准 程序结构和编程风格,它们被称为应用程序框架结构。MFC Ap p W
44、i z a r d 提供的应用程序框 架类型如表 1 所示。这些类型基本上能满足各个层次用户的不同需要,但一般地,用户更关 心的是 MFC Ap p Wi z a r d(e x e)应用程序框架,因为它包含用户最常用、最基本的 3 种应用程 序类型:单文档、多文档和基于对话框的应用。表 1.MFC Ap p Wi z a r d 创建的应用程序类型 名称 项目 ATL COM MFC Ap p Wi z a r d Cl u s t e r Re s o u r c e Ty p e Wi z a r d Cu s t o m MFCAp p Wi z a r d Da t a b a s
45、e Pr o j e c t De v St u d i o Ad d-i n Wi z a r d Ex t e n d e d St o r e d Pr o c Wi z a r d ISAPI Ex t e n s i o n Wi z a r d 创建 ATL(Ac t i v e Te m p l a t e Li b r a r y)应用模块工程 创建 Cl u s t e r Re s o u r c e(用于 Wi n d o w s NT 服务器)创建自己的应用程序向导 创建数据库应用程序 创建 Ac t i vp a g e 5e X 组件或 VBSc r i p t 宏
46、 创建基于 SQL 服务器下的外部存储过程中 创建 In t e r n e t Se r v e r 程序 Ma k e Fi l e MFC Ac t i v e X Co n t r o l Wi z a r d MFCAp p Wi z a r d (d l l)MFCAp p Wi z a r d (ex e)Ut i l i t y Pr o j e c t Wi n 32 Ap p l i c a t i o n Wi n 32 Co n s o l e Ap p l i c a t i o n Wi n 32 Dy n am i c-Li n k Li b r a r y 创建
47、独立于 Vi s u a l C+开发环境的应用程序 创建 Ac t i v e X Co n t r o l 应用程序 MFC 的动态链接库 一般 MFC 的 Wi n d o w s 应用程序 创建简单实用的应用程序 其他 Wi n 32 的 Wi n d o w s 应用程序 Wi n 32 的控制台应用程序 Wi n 32 的动态链接库 Wi n 32 St a t i c Li b r a r y Wi n 32 的静态链接库 所谓单文档应用程序是类似于 Wi nd o w s 记事本的程序,它的功能比较简单,复杂程度 适中,虽然每次只能打开和处理一个文档,但已能满足一般应用上的需要
48、。因此,大多数应 用程序的编制都是从单文档程序框架开始的。与单文档应用程序相比较,基于对话框的程序是最简单的,也是最紧凑的。它没有菜单、工具栏及状态栏,也不能处理文档,但它的好处是速度快、代码少,程序员所花费的开发和 调试时间短。多文档应用程序,顾名思义,能允许同时打开和处理多个文档。与单文档应用程序相比,增加了许多功能,因而需要大量额外的编程工作。例如它不仅需要跟踪所有打开文档的路径,而且还需要管理各文档窗口的显示和更新等。不论选择何种类型的应 用程序框架,一定要根据用户自己的具体需要而定,下面使用 MFC Ap p Wi z a r d(MFC 应用程序向导)来分别创建基于 MFC 的三种
49、 Wi n d o w s 应用:运行 Vi s u a l C+6.0。执行 Fi l e-Ne w 菜单命令,在弹出的 Ne w 对话框中单击 Pr o j e c t s 选项卡,在工程类型 列表中单击 MFC Ap p Wi z a r d (e x e),Pr o j e c t n a m e 编辑框中输入一个工程名,在 单击 Lo c a t i o n 编辑框后边的“”按钮选择工程文件夹存放路径,单击 OK 按钮确认。在接下来弹出的 MFC Ap p Wi z a r d St e p 1 对话框中,分别选中“Si n g l e d o c u m e n t”、“Mu l t i p l e Do c u m e n t s”和“Di a l o g b a s e”后单击 Fi n i s h 按钮,然后在后一个对话框中单击 OK 按钮。此时 Vi s u a l C+6.0 将分别为你产生一个基于 MFC 的单文档应用、多文档应用和 基于对话框的应用。执行 Bu i l d-Re b u i l d Al l 菜单命令或单击相应的工具栏按钮进行编译链接。执行 Bui l d-!Ex e c u t e 工程名.e x e 菜单命令或单击相应的工具栏按钮运行程序,观察运 行结果并比较三种应用之间的差异。p a g e 6
限制150内