📄 chap2_4.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>MFC编程</title>
</head>
<body link="#3973DE" alink="#000000" background="../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="13">
<tr>
<td width="363" bgcolor="#15397D" height="13"></td>
<td width="252" bgcolor="#000000" height="13"><p align="right"></font><small><span
style="text-decoration: none"><a href="../index.htm"><font color="#FFFFFF">电脑报网络学院Visual
C++网络教程</font></a></span></small></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><p align="center"></font><font
color="#3973DE"><font FACE="Times New Roman" size="4">2.4 MFC</font><font size="4">编程</font></font><font
FACE="Times New Roman" size="4"></p>
<p ALIGN="JUSTIFY"></font><span style="font-size: 9pt">微软基础类库(MFC:Microsoft
Foundation Class)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。MFC库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到你自己开发的应用程序中去。</span></p>
<p><span style="font-size: 9pt">对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用;另外,新的应用程序还能立即支持所有标准Windows特性,而且是用普通的、明确定义的形式。事实上,也就是在Windows应用程序界面基础上定义了一种新的标准——MFC标准。</span></p>
<p><span style="font-size: 9pt">为了更好的理解MFC,我们有必要了解一下MFC的历史。</span><b></p>
<p></b><span style="font-size: 9pt">2.4.1 MFC历史</span></p>
<p><span style="font-size: 9pt">开始,Microsoft建立了一个AFX小组,AFX代表Application
Framework,即应用程序框架。据说创建该小组原意是为了发布一个Borland
C++的OWL的竞争性产品,因为那时侯Borland 公司的应用程序框架OWL(object
Windows Language)已经做的相当成功。AFX小组象OWL那样,提出了一个高度抽象Windows
API的一个类库。</span></p>
<p><span style="font-size: 9pt">他们采用自顶向下的设计方法,逐步将对象抽象出来,并施加到Windows上。然后,他们试着花了几个月时间用这个类库来编写应用程序,结果发现这个类库偏离Windows
API实在太远,过分抽象并没有太大的实用性,相反大大降低了应用程序的效率。</span></p>
<p><span style="font-size: 9pt">于是,他们干脆放弃了整个AFX类库,对类库进行重新设计。这次,他们采用了自底向上的方法,从已有的Windows
API着手,将类建立在Windows API对象基础上,设计出后来成为MFC1.0的一个类库。但是,你现在仍然可以看到AFX时期的痕迹,许多源程序文件有afx前缀,如afxabort.cpp,afxmem.cpp。MFC延用了许多AFX类库的宏,因此我们经常会看到以AFX开头的宏。</span></p>
<p><span style="font-size: 9pt">AFX小组实际上做了两件工作:MFC类库和对MFC的IDE支持(即资源编译器和操作向导)。在1994年4月份之后,AFX的名字停止使用,该小组成员成为Visual
C++开发组的一部分,即现在的MFC小组。</span></p>
<p><span style="font-size: 9pt">MFC1.0版于1992年同Microsoft C/C++7.0同时发布。它提供了对Windows
API简单的抽象和封装,还没有我们现在常用的文档/视结构特性。但它引入了CObject,通过CArchive的持续化和其他一些MFC中仍然使用的特性,从而奠定了MFC的基础。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC2.0在MFC1.0基础上增加了文档/视结构框架、OLE1.0类、消息映射和公用对话框类,废弃了1.0版中的CModalDialog类并将它的功能移入到CDialog中,并增加了工具条、对话条、分割视窗的支持。MFC2.1随同Visual
C++ 1.1 for NT发布,它把MFC2.0移植到了Win32上。MFC2.5随同Visual C++1.5一起发布,它引入了OLE
2.0和ODBC类。它是最后的官方的16位发行版,于93年12月发布。目前,在开发16位Windows程序时,Visual
C++1.5和MFC 2.5仍然有大量的用户。随后的MFC2.51、2.52纠正了MFC.25中的一些错误,增加了标签式对话框、WinSock和MAPI(Microsoft
电子邮件应用程序接口)支持。MFC3.1同Visual C++2.1一起于1995年1月份发布,它引入了Windows95公共控件(包括动画、热键、图象列表、工具条提示等等)。MFC4.0于1995年12月份同Visual
C++4.0一起发布。Microsoft直接从Visual C++2.0一下子跳过一个版本号,升级到了4.0,以保持MFC版本号和Visual
C++版本号的一致性,但这种一致性又在Visual C++5.0中打破了。在MFC4.0中增加了CSynchronize,CMutex,CEvent,CMultiLock,CShellNew以更好的支持多线程以及Windows
95的其他一些特性。Visual C++还引入了Component Gallery(组件画廊)、STL支持和大量的新特性。MFC4.1最重要的特性是支持Win32s。许多MFC开发者一直都在使用该版本。MFC4.1修正了4.0的一些错误并增加了Internet特性。MFC4.2增加了ISAPI和OCX容器支持。</span></p>
<p><span style="font-size: 9pt">MFC4.21于1997年3月19日同Visual C++5.0一起发布,它是目前最新和最完善的MFC版本。它只增加了对微软的IntelliMouse(智能鼠标器)的支持。现在MFC版本号又不与Visual
C++匹配了。</span></p>
<p><span style="font-size: 9pt">MFC发行版列表如下:</span><b></p>
<p><span style="font-size: 9pt">MFC Release MSVC Release 16位或32位 备注 </span></b></p>
<p><span style="font-size: 9pt">1.0 16 简单的 封装Windows</span></p>
<p><span style="font-size: 9pt">2.0 1.0 16 增加了文档/视结构</span></p>
<p><span style="font-size: 9pt">2.1 1.1 for NT 32 第一个NT的发行版 </span></p>
<p><span style="font-size: 9pt">2.5 1.5 16 OLE/ODBC,最后一个</span></p>
<p><span style="font-size: 9pt">16位版本</span></p>
<p><span style="font-size: 9pt">2.51 2.0 16 修正错误 </span></p>
<p><span style="font-size: 9pt">2.52 2.1 16 增加标签式对话框</span></p>
<p><span style="font-size: 9pt">2.52b 2.2 16</span></p>
<p><span style="font-size: 9pt">2.5c 4.0 16</span></p>
<p><span style="font-size: 9pt">3.0 2.0 32 标签式对话框、可停泊工具条</span></p>
<p><span style="font-size: 9pt">3.1 2.1 32 Winsock/MAPI, Windows公共控 制 </span></p>
<p><span style="font-size: 9pt">3.2 2.2 32</span></p>
<p><span style="font-size: 9pt">4.0 4.0 32 Win 95, 线程类, OCX 容器 </span></p>
<p><span style="font-size: 9pt">4.1 4.1 32 sweeper (WinInet) classes</span></p>
<p><span style="font-size: 9pt">**以上是最后支持Win32s的版本</span></p>
<p><span style="font-size: 9pt">4.2 4.2 32 修正错误, ISAPI classes</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: 9pt">4.2b internet dl 32 修正错误</span></p>
<p><span style="font-size: 9pt">4.21 5.0 32 IntelliMouse&trade; support.</span></p>
<p> </p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">2.4.2 MFC类库概念和组成</font></span></p>
<p><span style="font-size: 9pt">类库是一个可以在应用中使用的相互关联的C++类的集合。类库有些随编译器提供,如Borland
C++ Turbo Vision等;有的是由其他软件公司销售,如用于数据库开发的CodeBase;有的则是由用户自己开发的。比如图象处理类库完成图象显示、格式转换、量化等;串行通信类库用于支持串行口输入输出。有些情况下用户可以直接利用类库中包含的类定义应用程序所需的变量,有时则需要从类库所提供的类中派生出新的类,这依赖于类库的设计和具体的应用程序。</span></p>
<p><span style="font-size: 9pt">Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++
Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的Windows
API。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。</span></p>
<p><span style="font-size: 9pt">MFC可分为两个主要部分:(1)基础类(2)宏和全程函数。</span></p>
<p> </p>
<p><b> </p>
<p><span style="font-size: 9pt">MFC基础类</span></b></p>
<p><span style="font-size: 9pt">MFC中的类按功能来分可划分为以下几类:</span></p>
<blockquote>
<p><span style="font-size: 9pt">基类</span></p>
<p><span style="font-size: 9pt">应用程序框架类</span></p>
<p><span style="font-size: 9pt">应用程序类</span></p>
<p><span style="font-size: 9pt">命令相关类</span></p>
<p><span style="font-size: 9pt">文档/视类</span></p>
<p><span style="font-size: 9pt">线程类</span></p>
<p><span style="font-size: 9pt">可视对象类</span></p>
<p><span style="font-size: 9pt">窗口类</span></p>
<p><span style="font-size: 9pt">视类</span></p>
<p><span style="font-size: 9pt">对话框类</span></p>
<p><span style="font-size: 9pt">属性表 </span></p>
<p><span style="font-size: 9pt">控制类</span></p>
<p><span style="font-size: 9pt">菜单类</span></p>
<p><span style="font-size: 9pt">设备描述表</span></p>
<p><span style="font-size: 9pt">绘画对象类</span></p>
<p><span style="font-size: 9pt">通用类</span></p>
<p><span style="font-size: 9pt">文件</span></p>
<p><span style="font-size: 9pt">诊断</span></p>
<p><span style="font-size: 9pt">异常</span></p>
<p><span style="font-size: 9pt">收集</span></p>
<p><span style="font-size: 9pt">模板收集</span></p>
<p><span style="font-size: 9pt">其他支持类</span></p>
<p><span style="font-size: 9pt">OLE2类</span></p>
<p><span style="font-size: 9pt">OLE基类</span></p>
<p><span style="font-size: 9pt">OLE可视编辑包装程序类</span></p>
<p><span style="font-size: 9pt">OLE 可视编辑服务器程序类</span></p>
<p><span style="font-size: 9pt">OLE数据传输类</span></p>
<p><span style="font-size: 9pt">OLE对话框类</span></p>
<p><span style="font-size: 9pt">其他OLE类</span></p>
<p><span style="font-size: 9pt">数据库类</span></p>
<b>
</blockquote>
<p> </p>
<p><span style="font-size: 9pt">宏和全局函数</span></b></p>
<p><span style="font-size: 9pt">若某个函数或变量不是某个类的一个成员,那么它是一个全程函数或变量。</span></p>
<p><span style="font-size: 9pt">Microsoft基本宏和全程函数提供以下功能:</span></p>
<blockquote>
<blockquote>
<p><span style="font-size: 9pt">数据类型</span></p>
<p><span style="font-size: 9pt">运行时刻对象类型服务</span></p>
<p><span style="font-size: 9pt">诊断服务</span></p>
<p><span style="font-size: 9pt">异常处理</span></p>
<p><span style="font-size: 9pt">CString格式化及信息框显示</span></p>
<p><span style="font-size: 9pt">消息映射</span></p>
<p><span style="font-size: 9pt">应用消息和管理</span></p>
<p><span style="font-size: 9pt">对象连接和嵌入(OLE)服务</span></p>
<p><span style="font-size: 9pt">标准命令和Windows IDs</span></p>
</blockquote>
</blockquote>
<p><b> </p>
<p><span style="font-size: 9pt">约定</b>:全程函数以“Afx”为前缀,所有全程变量都是以“afx”为前缀,宏不带任何特别前缀,但是全部大写。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">常见的全局函数和宏有:AfxGetApp,AfxGetMainWnd,AfxMessageBox,DEBUG_NEW等,我们会在后面的章节中用到并对它们进行介绍。</span></p>
<p><span style="font-size: 9pt">从继承关系来看,又可将MFC中的类分成两大类:大多数的MFC类是从CObject继承下来;另外一些类则不是从CObject类继承下来,这些类包括:字符串类CString,日期时间类CTime,矩形类CRect,点CPoint等,它们提供程序辅助功能。</span></p>
<p><span style="font-size: 9pt">由于MFC中大部分类是从CObject继承下来的,CObject类描述了几乎所有的MFC中其他类的一些公共特性,因此我们有必要理解CObject类。
</span></p>
<p><span style="font-size: 9pt">我们首先查看一下CObject类的定义,CObject类定义如下清单2.1所示:</span></p>
<p><b> </p>
<p><span style="font-size: 9pt">清单2.1CObject类的定义</span></b></p>
<p><span style="font-size: 9pt">// class CObject is the root of all compliant objects</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -