到目前为止,我们只讨论了M FC的C Wnd类。在本章中,我们将讨论M FC提供的其他重要的类,这些类可以分成以下几种:
■■■■■■■■
访问用户界面的类,包括C Wnd。帮助绘图的类。
提供运行一个应用程序所需功能的类。处理数组和数据列表的类。访问数据库的类。维护文件的类。
允许应用程序在网上或I nternet上通信的类。一些用来帮助同步和调试应用程序的混合类。
本章的目标不是成为M FC参考指南,而是综合论述M FC所能提供的功能。对于任何在本章中没有讨论的类,或有关某一特定的类的详细描述,请参考有关M FC文献。
大部分O LE类没有在本章中论及,因为它们不在本书的讨论范围。
2.1 基类
大多数M F C类是从三个基类(Base Class)派生的:C O b j e c t、C C m d Ta rg e t和C W n d。C CmdTa rg et派生于C Object类,而C Wnd于C CmdTa rg et类。从C Object派生的类,具有在运行时获得对象大小和名字的能力;从C CmdTa rg et派生的类,能够处理命令消息;从C Wnd派生的类,能控制它们自己的窗口。2.1.1 CObject
C O b j e c t类本身提供的功能较少,主要工作由六个伴生宏(
companion macros)完成。
C Object和这些宏一起,允许C Object的派生类在运行时获取类名和对象大小,创建一个类对象而不必知道类名,以及允许从文件设备中存取一个类的实例而不必知道类名。
下面的宏允许类的一个实例在运行时知道它的类名和对象大小:
DECLARE_DYNAMIC (CYo urClass)// in the .h file
IMPLEMENT_DYNAMIC (CYourClass, CYourBaseClass) // in the .cpp file
可以用CObject::GetRuntimeClass ( )获得运行时使用这些宏的类的详情。
下面这些宏包括了前面两个宏的功能,但是允许在不知道类名的情况下创建一个类的实例。
D ECLARE_DYNCREATE (CYo urClass)// in the .h fileI MPLEMENT_DYNCREATE (CYourClass, CYo urBaseClass)
// in the .cpp file
在不知道类名的情况下,可以用CRuntimeClass::CreateObject ( )创建一个运用这些宏的类的实例。
下载例存到磁盘上。
第2章类19下面这些宏包括了前面所有宏的功能,但还允许在不知道类名的情况下,把一个类的实
DECLARE_SERIAL (CYo urClass)// in the .h file
IMPLEMENT_SERIAL (CYourClass, CYourBaseClass, schema) // in the .cpp file
有关使用最后两个宏的例子,参见例7 0。2.1.2 CCmdTarget
由C CmdTa rg et派生的类,可以接收和处理来自应用程序菜单或工具栏的命令消息。有关C CmdTa rg et类的详细的讨论将在第3章中进行。2.1.3 CWnd
这在第1章中已讨论过,C Wnd的成员函数封装了Windows API中负责维护和创建窗口的函数。C Wnd是从C CmdTa rg et派生的,因此,也能接收和处理命令消息。
注意在本章中,用下面的字母标明MFC类是从前述的基类中哪一个派生的。
■■■
O表示该类是从CObject派生的。
O/C表示该类是从CObject和CCmdTarget派生的。
O/C/W表示该类是从CObject、CCmdTarget和CWnd派生的。
2.2 应用程序、框架、文档和视图类
使用Developer Studio的A ppWi zard(应用程序向导)创建M FC应用程序时,应用程序从四个基类派生:
C WinApp 是应用程序的“应用程序类”,负责初始化和运行应用程序。C FrameWnd是应用程序的“框架类”,负责显示和搜寻用户命令。
CDocument 是应用程序的“文档类”,负责装载和维护文档。文档可以是从文档到网络设备设置的任何内容。
C view是应用程序的“视图类”,负责为文档提供一个或多个视图。
注意在本书中,我们将用应用程序类、框架类等术语表示从这四个基类派生的类。根据所建的应用程序类型,应用程序中A ppWi zard包含相应的基类。
对话框应用程序用户界面只有一个对话框,没有框架类、文档类或视图类。对话框应用程序只用应用程序类的派生类—C Wi nApp。对话框用M FC的C Dialog类创建,这将在随后部分讨论。
单文档界面应用程序能在某个时间内装入和编辑一个文档,使用了前面提及的所有四个基类。
多文档界面应用程序
一次可以装载和编辑多个文档,并且不但使用了所有四个基类,
还使用了C FrameWnd的两个派生类,即C MDIFrameWnd和C MDIChildWnd。
C Document和C Vi ew类的派生类负责第1章中描述的文档/视图。.使用A ppWi zard的一个例子,参见例2。
20第一部分基础知识下载2.2.1 CWinApp(O/C/W)
应用程序类C Wi nAPP(O/C/W)是应用程序开始后创建的第一个对象,并且是在结束前最后一个执行的对象。起动时,应用程序类负责创建应用程序的其余对象。
■■
对于一个对话框应用程序,应用程序类应用C Dialog创建一个对话框。
对于一个S DI应用程序,应用程序类创建一个或多个文档模板(见下面的讨论),然后用模板打开一个空文档。
对于一个M DI应用程序,在主框架类中,应用程序类创建一个或多个文档模板,然后用模板打开一个空文档。
■
在下一章中还将看到,应用程序类也同操作系统交互,作为中继,将鼠标信息和键盘输入传给应用程序的其余部分。
应用程序类是由C Wi nApp派生的,并且,A ppWi zard以C XxxApp形式进行命名,这里的X xx是应用程序的名字。
1. 文档模板
应用程序打开一个文档时,文档模板定义创建什么样的框架、文档和视图。要创建一个文档模板,要么为S DI应用程序创建一个C SingleDocTe mplate类,要么为M DI应用程序创建C MultiDocTe mplate类,并且用三个类的指针对它进行初始化。
p DocTe mplate=newCMultiDocTemplate (I DR_APPTYPE,
RUNTIME_CLASS (CAppDoc),RUNTIME_CLASS (CChildFrame),RUNTIME_CLASS (CAppVi ew));
// Your Document Class// Your Frame Class// Your View Class
这里的R U N T I M E _ C L A S S宏返回一个指向类的C R u n t i m e C l a s s结构的指针,该结构用D E C L A R E _ D Y N C R E AT E和I MPLEMENT_DYNCREAT E宏填加到类中。文档模板通过用CRuntimeClass::CreateObject ( )函数创建一个所有三个类的实例来打开一个文档。
2. 线程
C Wi nApp类自身是从C Wi nThread派生的。C Wi nThread类封装了系统中用来创建和维护应用程序线程的Windows API函数。实际上,可以通过创建C Wi nThread类的另一个实例实现应用程序多任务。在应用程序中,C Wi nApp类代表主要的执行线程。
3. CFrameWnd(O/C/W)
此框架类C FrameWnd(O/C/W)是应用程序运行时创建的第二个对象,负责显示和监督用户对应用程序其余部分的命令。
对于一个S D I应用程序,框架类是从C F r a m e W n d派生的,A p p Wi z a r d自动命名为:C MainFrame。
对于一个M D I应用程序,框架类派生于C M D I F r a m e W n d,A p p Wi z a r d自动命名为C M a i n F r a m e。在M D I应用程序中,每个打开的文档有一个子框架类,每个子框架类是从C MDIChildWnd派生的。A ppWi zard自动指定子框架类名为C ChildFrm。
对于一个对话框应用程序来说,没有框架类。在前面已提过,一个对话框应用程序是由一个应用程序类和一个对话框类组成的。
4. CDocument (O/C)
通常,文档类C Document(O /C)是应用程序打开一个新文档或一个已存在的文档时创建的
下载第2章类21对象。文档类负责将一个文档赋给它的成员变量,并允许视图类编辑这些成员变量。一个文档包括从图形文件到可编程控制的任何内容。文档类派生于C Documnt,A ppWi zard自动命名为C XxxDoc,X xx是应用程序名。2.2.2 CView (O/C/W)
在创建文档类的一个实例之后将创建视图类C Wi ew(O/C/W)的一个实例。视图类负责描述文档类的内容,它也可以允许用户编辑文档。
窗口分区类,即C SplitterWnd,允许文档有多视图;这些视图以由相同视图类的一些实例创建,也可以由完全不同的视图类实例创建。
A p p Wi z a r d允许视图类从几个基类(包括C Tr e e Vi e w、C E d i t Vi e w、C R i c h E d i t Vi e w、C ListVi ew等)之一派生,每一个基类赋予应用程序不同的功能集。有关这些类的更多例子参见例1。所有这些类都派生于C Vi e w类,不管选择哪个基类,A p p Wi z a r d自动命名派生类为C XxxVi ew,这里的X xx是应用程序名。
前面已提及,可以从四个基类创建三种类型的应用程序:对话框、单文档、多文档。下面我们将详细讨论这些应用程序类型。
1. 对话框应用程序
对话框应用程序是由一个派生于C Wi nApp的应用程序类,和用派生于C Dialog类创建的对话框构成的(见图2 -1)。
应用程序类
对话框类
①系统创建应用程序②应用程序类创建对
话框类的实例类的实例
③对话框类创建其他控件类,这些④没有创建框架、
文档或视图类类一起创建了屏幕上的窗口。
图2-1 一个对话框应用程序由一个应用程序类和一个对话框类创建
2. 单文档界面应用程序
单文档界面应用程序包括以下类:从C Wi nApp派生的应用程序类、从C FrameWnd派生的框架类、从C Document派生的文档类,以及每个文档一个或多个视图类,这些视图类是从一些派生于C Vi ew的视图类派生的(见图2 -2)。
3. 多文档界面应用程序
多文档界面( M D I )应用程序包括以下类:派生于C Wi n A p p的应用程序类、派生于C M D I F r a m e W n d的框架类、派生于C M D I C h i l d W n d的一个或多个子框架类、派生于C Document的每个子框架一个文档类和派生于C Vi ew的每个文档一个或多个视图类(见图2 -3)。
4. 应该选择哪一种应用程序类型
对话框应用程序一般在用户交互要求有限的情况下使用。然而就个人而言,宁愿使用一个带窗体视图( CFormVi ew)的S DI应用程序,而不愿意使用一个对话框应用程序,这样既利用了创建对话框应用程序的简单性,又具备了单文档应用程序的文档特性。
22第一部分基础知识下载文档类
应用程序类
文档模板类
框架类
④框架和视图类在屏幕上显示窗口
①系统创建应用程序类的实例
②应用程序类创建一个文档模板,并告知它装入一个空的文档类
视图类
③接着,文档模板类创建文档、框架和视图类的一个实例
图2-2 一个SDI应用程序由应用程序、框架、文档和视图类创建
文档类
文档模板类
应用程序类
子框架类
框架类
①系统创建应用程序类的一个
实例
②应用程序创建文档模板和框架类的一个实例,然后告知文档类装入一个新的空文档
④框架、子框架和视图类在屏幕上创建窗口
视图类
③文档模板创建文档、
子框架和视图类的一个实例
图2-3 一个MDI应用程序由应用程序、框架、子框架、文档和视图类创建
什么时候应该使用M DI应用程序,而不是S DI应用程序呢?如果在运行期间应用程序只与一个文档有关连,那么就使用S DI方法。但是,如果应用程序能产生多个文档,并对多个文档进行处理(即使这不是一次性完成的),这时应该采取M DI的方法,即使在开始时并没有看到在同一时间修改多个文档的可能。一个M DI应用程序并不比一个S DI应用程序复杂多少,却可以带给用户在同一时间看阅多个文档的方便。
2.3 其他用户界面类
除了框架和视图类外,M FC还提供了许多其他支持用户界面的类。控件窗口类封装了通用控件。
菜单类处理菜单,就如C Wnd类处理窗口一样。
下载对话框类封装了对话框和通用对话(Common Dialog)框。控制条类封装了控制条(工具栏、对话条和状态栏)。
属性类封装了属性表(Property Sheet)和属性页(Property Page)。2.3.1 通用控件类
第2章类23通用控件类( O/C/W)封装了通用控件(如按钮、列表框等)的功能。这些类派生于C Wnd,继承了诸如S howWindow ( )和M oveWindow ( )之类的窗口成员函数。当这些类创建窗口时,它们使用一个通用控件窗口类。例如,用B UTTO N窗口类创建真实的窗口:
Create (_T (\"BUTTON\"), lpszCaption, dwStyle, rect, pParentWnd, nID);
C B u t t o n通用控件类创建一个按钮时,它就用
下面表中列出了通用控件类、它们创建的控件,以及它们使用的窗口类。
通用控件M FC类和它们的窗口类
M FC类
CAnimateCtrl (O/C/W)C Button(O/C/W)C ComboBox(O/C/W)C Edit(O/C/W)C HeaderCtrl(O/C/W)C ListBox(O/C/W)C ListCtrl(O/C/W)C ProgressCtrl(O/C/W)C ScrollBar(O/C/W)C SliderCtrl(O/C/W)C SpinButtonCtrl(O/C/W)C Static(O/C/W)C Tr eeCtrl(O/C/W)C Ta bCtrl(O/C/W)C DateTi meCtrl(O/C/W)C MonthCalCtrl(O/C/W)C HotKeyCtrl(O/C/W)C To olTi pCtrl(O/C/W)
通用控件动画控件按钮控件组合框控件编辑控件标题控件列表框控件列表控件进度指示控件滚动条控件滑块控件微调按钮控件静态文本控件树型控件标签控件日期/时间控件月历控件热键控件工具提示控件
窗口类S ysAnimate32B UTTO NC OMBOBOXE DITS ysHeader32L ISTBOXS ysListVi ew32m sctls_progress32S CROLLBARm sctls_trackbar32m sctls_updown32S TAT ICS ysTr eeVi ew32S ysTa bControl32S ysDateTi mePick32S ysMonthCal32m sctls_hotkey32t ooltips_class32
不是所有的通用控件类都简单地封装一个通用控件窗口类。事实上,有三个M FC类提供了通用控件中没有的功能。下面的表格列出了这些类、它们派生的M FC类和它们所提供的额外功能。
派生的M FC类和它们的M FC基类
M FC类C BitmapButtonC CheckListBoxC DragListBox
所派生的M FC类
C ButtonC ListBoxC ListBox
增加的功能更好地支持按钮上的位图列表框中的复选框列表框中用户可拖拉的工程
2.3.2 菜单类
菜单类封装了Windows API中用来创建和维护菜单的函数。C M e n u还有两个成员函数
24一样。第一部分基础知识下载Attach ( )和Detach ( ),允许封装一个已建的菜单,如同C Wnd对象能够封装一个已有的窗口2.3.3 对话框类C Dialog类封装了用来创建对话框的Windows API。对话框是弹出式窗口,在创建时可以用对话框模板中定义的控件窗口来填充。通用对话框M FC类M FC还有六个类封装了Windows API用来创建通用对话框的函数。通用对话框是一些随控件预先装入的用于提示用户输入一些常用信息的对话框,如装入或存储的文件名、颜色、字体和打印参数。通用对话框不但为用户提供了一个熟悉的对话框,而且节省了书写这些对话的工作量。下面的表格显示了通用对话框的目的、提供它们的Windows APIs和封装这些Wi ndowsA PIs的M FC通用对话框类。通用对话框M FC类及其用途:通用对话框选择颜色打开/保存文件查找或替换文本选择字体设置打印页打印Windows API调用: :ChooseColor(): :GetOpenFileName(): :GetSaveFileName(): :FindTe xt(): :ReplaceTe xt(): :ChooseFont(): :PageSetupDlg(): :PrintDlg()C FontDialogCPa geSetupDialogCPr intDialogC FindReplaceDialogM FC类C ColorDialogCFi leDialog2.3.4 控制条类控制条类( O/C/W)封装了为应用程序提供工具栏、状态栏、对话条和rebar 的Windows API函数。■C ToolBar (O/C/W)和C ToolBarCtrl (O/C/W)类帮助创建和维护一个工具栏。C To olBarCtrl类封装了系统提供的窗口类To olbarWi ndow32的功能,并由该类来做实际的工具栏的创建和维护工作。而C To o l B a r类就是通常的M F C。C To o l B a r能提供比C To olBarCtrl更多的功能,但必须以开销更多的内存为代价。■CStatusBar (O/C/W)和CStatusBarCtrl (O/C/W)类创建和维护状态栏。C StatusBarCtrl类封装了系统提供的窗口类m sctls-statusbar32,并由该类来做实际的状态栏的创建和维护工作。而C StatusBar类就是通常的M FC。C StatusBar能提供比C StatusBarCtrl更多的功能,但必须以开销更多的内存为代价来支持它。■CDialogBar (O/C/W)类创建和维护对话条。一个对话条是对话框和工具栏的混和产物,它显示一个对话框模板,但却象一个工具栏一样浮动并停靠在主框架窗口中。■CRebar (O/C/W)和CRebarCtrl (O/C/W)类创建和维护R ebar。R ebar是窗口控件,可以包含一个工具栏、一个对话条和任何其他子窗口。它们提供了一个移动条(grabber bar)(左边双线),使它们更易于被移动,也更易于在他们的背景上画一幅位图。C ReBarCtrl类下载第2章类25封装了由系统提供的Wi ndow类R eBarWi ndow32的功能,并由该类做实际的R eBar创建和维护工作。换个角度说,C ReBar类就是通常的M FC。C ReBar提供比C ReBarCtrl更多的功能,但以开销更多的内存为代价。
2.3.5 属性类
属性类封装了Windows API中用来为应用程序提供属性页和属性表的函数。一个或多个属性页出现在属性表中,以创建Wi ndows用户熟悉的t abbed视图。该视图通常用来选择程序选项。
■
C PropertySheet(O/C/W)类创建一个属性表,尽管C PropertySheet不是从C Dialog派生的,但它们非常相似。
C PropertyPage(O/C/W/CDialog)类创建一个属性类,该类是从C Dialog派生的。
■
关于属性表和属性页的例子,参见例8。
2.4 绘图类
2.4.1 设备环境类
C D C ( 0 )类封装了Windows API中用来画图的函数。该类也维护“设备环境(De v i c eCo ntext)”,设备环境是内存中的一个对象,包含用来绘制的设备的所有特征。这些特征包括设备的最大尺寸和发生作用的方式,设备可以是屏幕或打印机。有关设备环境和C DC类的成员函数的更详细的讨论,请参看第4章。
有四个类是从C DC类派生的,并提供了额外功能。C ClientDC
用来方便地创建和破坏一个设备环境,C ClientDC通常在堆栈中创建。它的
构造函数通过调用CDC::GetDC ( )为窗口的客户区创建一个设备环境。当例程返回时,C ClientDC的析构函数通过调用CDC:ReleaseDC ( )销毁该设备。既不麻烦也不复杂,更不会因忘记释放设备环境而导致资源泄漏。
C Wi ndowDC类维护窗口的非客户区,如C ClientDC维护客户区一样。C PaintDC
在被构造以获得设备环境时调用CWnd::BeginPaint ( )。在这种情况下,设备
环境只允许在已被无效化的窗口客户区绘图,而不能在整个客户区绘图。析构时,C PaintDC类调用CWnd::EndPaint ( )。
C MetaFileDC
创建一个M icrosoft元文件,元文件是一个磁盘文件,它包含绘制一幅图
形时所必需的全部绘图行为和模型。可以通过打开一个元文件设备环境创建一个元文件,然后用画图工具对它进行绘制,就当它是一个屏幕或打印机设备一样。产生的文件可以在未来的某个时刻被再次读进,以创建其他设备之一的图像。想更多地了解元文件,参见第4章。2.4.2 图形对象类
设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外,Wi ndows还有其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时所用的字体。图形对象类封装了所有六个图形对象。
下面的表格列出了M FC类,它封装的图形对象,以及存储在对象中的绘图特征。
26MFC 类C BitmapCB rushC FontC PaletteC PenC Rgn第一部分基础知识下载图形对象目的内存中的位图画刷特性—填充某个图形时所使用的颜色和模式字体特性—写文本时所使用的字体调色板颜色画笔特性—画轮廓时所使用的线的粗细区域特性—包括定义它的点图形对象类和它们封装的句柄图形对象句柄H BITMAPH BRUSHH FONTH PA LETTEH PENH RGN2.5 文件类CFile ( )类封装了创建和维护平面文件的Windows API,三个从C File派生的M FC类提供附加功能:C MemFile参见例6 5。C SharedFileC StdioFile参见例6 4。还有一个感兴趣的文件类是CFileFind (0),用它来定位磁盘上的本地文件。C FileFind类是另外两个类,C FtpFileFind和C GopherFileFind类的基类,这两个类用来帮助在I nternet上定位文件。这两个类将在本章后面讨论。CArchive和串行化在一个称为串行化的过程中,C Archive类用C File类将文档的类对象保存到磁盘上。应用“串行化”,可以将类的成员变量和全部类对象依次保存到一个存档设备上,以便它们能以完全相同的次序被恢复。有关串行化的一些例子参见第1 3章。与C MemFile类似,但C SharedFile配置在全局堆上,这使得能用剪贴板和允许对以回车控制符和换行符结束的文本串进行读写。有关使用C StdioFileD DE对它进行共享。有关共享内存文件的例子参见例7 6。允许不在磁盘而在内存里创建文件。当构造一个C MemClass对象时,文件即被打开,并能用它的成员函数对它进行读写,就象一个磁盘文件一样。有关内存文件的例子2.6 数据库类M FC库具有支持两种类型数据库的类:开放数据库连接(ODBC) 封装了大多数数据库厂商支持的ODBC API。如果应用程序使用了M FC的O DBC类,它就可以支持任何支持O DBC标准的数据库管理系统( DBMS)。数据访问对象(DAO) 支持一个更新的数据库A PI,这已被Microsoft Jet数据库引擎有效利用。也可以通过J et引擎访问符合O DBC的数据库系统和其他数据源。2.6.1 ODBC类三个主要的O DBC类:CDatabase (0)用ODBC API打开一个D BMS数据库。构造一个C Database对象后,可以用它的OpenEx ( )成员函数创建与数据库的连接。调用C Database成员函数Close ( )结束连接。C Recordset通过数据连接来保存和检索记录。下载C DBVariant 代表一个记录集中的一列,而不必考虑数据类型。想更多了解访问O DBC数据,参见例7 2。2.6.2 DAO类
D AO类包括与O DBC类相似的三个类:C DaoDatabase( 0)打开一个D AO数据库。C DaoRecordSet( 0)容纳记录。C OleVariant 代表记录列。D AO还包括另外三个类:
第2章类27CDaoWorkSpace(0) 管理数据库会话,允许事务被处理(存储到数据库)或取消操作(恢复)。CDaoQueryDef (0)代表一个查询定义。
C DaoTableDef (0)代表一个包括域和索引结构的表定义。想更多了解访问一个D AO数据库,参见例7 3。
2.7 数据集类
数据集类维护和支持数组、列表和数据对象映像。C Array
该类及其派生类支持数据对象数组。一个数组由一个或多个相同的数据对象组
成(如整数、类等),它们在内存中相邻,可以通过简单索引访问它们。C Array类可以动态增加或减少数组大小。有一些派生C Array的类(如C ByteArray、C DWo rdArray等),允许创建一个类型安全( type-safe)的数组。然而,还有一个CArray C List 该类及其派生类支持数据对象的链接表。一个链接表由一个或多个相同的数据对 象组成(如整型、类等),它们在内存中不连续,但数据对象是双向连接的,以便于通过链表前后搜索数据。有些C List的派生类(如C PtrList、C ObList等),允许创建一个类型安全的列表。然而,还有一个Clist C Map 该类及其派生类支持数据对象的字典。在一个二进制或文本关键字约束下,数据 字典存储一个或多个相同数据对象(如整型、类等),可以用该关键字检索数据项。举例来说,因为Wi ndows不跟踪哪个MFC CWnd对象属于哪个窗口,所以应用程序使用C Map对象将窗口句柄与它们的C Wnd对象关联。有些C Map的派生类(如C MapWo rdTo Ptr、C ObTo String等),允许创建一个类型安全的字典。不过,还有一个CMap 有关上述每个类的例子,参见例7 8、例7 9和例8 0。 2.8 其他数据类 M FC库还包括其他一些数据类: ■ C Ti me和C Ti meSpan类具有这样的成员函数,它们既可以读入,又可以格式化t ime_t数据类型的时间串(见例8 1)。 C OleDateTi me和C OleDateSpan类具有这样的成员函数,它们既可以读入,又可以格式 ■ 28第一部分基础知识下载化OLE DAT E数据类型的时间和日期串(见例8 1)。C Ti me或C OleDateTi me 应该使用哪一个,CTime还是C OleDateTi me?这取决于想要达到的流行程度。C Ti me支持的t ime_t数据类型易于存储和传输,因为它仅仅是个3 2位整型数。然而,CTime却没有C OleDateTi me所具有的那么好的函数,如“获得一年中的某一天”。当然t ime_t数据类型在21世纪将有Y2K问题(2000年问题),因为它表示自1/1/70所经历的秒数。 ■■■■■ C oleCurrency类具有读入和格式化OLE CURRENCY数据类型的成员函数。C String类具有操纵文本串的成员函数,C String操纵的数据类型为T CHAR。C Point类提供了操纵P OINT结构的成员函数,该结构定义了一个点的X和Y坐标。C Size类提供了操纵S IZE结构的成员函数,该结构定义了尺寸的宽和高。C Rect类提供了操纵R ECT结构的成员函数,该结构定义了矩形的四个点。 2.9 通信类 M FC库包含了一些允许应用程序与网络或因特网( Internet)进行通信的类。1. 网络类(Network Classes) CASyncSocket (0)允许应用程序通过网络与其他应用程序进行通信。C ASyncSocket封装了Window Socket API, Window Socket API是基于伯克利的C alifornia大学的B SD(伯克利软件发行中心)的UNIX Socket实现。C ASyncSocket能存取网络通信中的位和字节。 C Socket是从C ASyncSocket派生的类,它允许在网络上发送和接收文件而不必考虑细节 chive对象,问题。可以创建一个C SocketFile对象,并将它与C Socket关联;然后创建一个C Ar 并与C SocketFile对象关联。此时发送一个文件只是在网络上将它串行化的问题。 2. 因特网类 M FC有两组因特网类(Internet Classes):一组允许应用程序成为一个客户(如We b浏览器),而另一组用来增强Internet HTTP服务器软件功能(如We b站点)。 3. 客户类 M FC的因特网客户类(Client Classes)封装了Win32 Internet Extensions (Wi nInet),允许用C ++语言利用四种协议之一对因特网进行访问,这四种协议为:文件传输协议( FTP),超文本传输协议( HTTP)、g opher和文件: CInternetSession (0)类有两种方式与We b站点上的文件相互作用,对于简单的阅读或下载文件,可以用OpenURL ( )成员函数,并将We b站点上文件的U RL(通用资源定位器)传给它。OpenURL ( )返回一个指向另一个MFC 因特网类的指针,该类取决于用户所使用的U RL。 U RL前缀F ile://h ttp://返回的因特网类的指针C StdioFile*C HttpFile*U RL前缀G opher://f tp://返回的因特网类的指针C GopherFile*C InternetFile*上面的每个因特网类都派生于C StdioFile,用户可以读这些文件对象,但不能写。对一个文件进行写操作或执行一些其他特定协议的操作,必须先用C InternetSession的另一个成员函数打开一个连接。该连接仍然在另一个MFC 因特网类中返回。 下载协F TPH TTPG opher议调用的C internetSession成员函数G etFtpConnection()G etHttpConnection()G etGopherConnection()第2章类29返回的因特网类指针C FtpConnection*C HttpConnection*C GopherConnection*然后,可以用C FtpConnection、C HttpConnection或C GopherConnection的成员函数与We b站点相互作用。另外三个相关的MFC 因特网客户类是CFtpFileFind, CGopherFileFind和C GopherLocator。C FtpFileFind和C GopherFileFind派生于前面提及的C FindFile类,可以在I nternet上定位文件。C GopherLocator从g opher服务器获得一个g opher“定位器”,并使定位器与C GopherFileFind联系。4. Internet服务器扩展类M FC有些类允许在因特网服务器中添加功能,然而,要对这些类进行工作,必须有一个I SAPI—兼容的H TTP服务器,而M icrosoft没有用M FC对它提供支持,一个差不多与它兼容的服务器是M icrosoft的因特网信息服务器。■■C HttpServer类可以被服务器创建,处理来自客户浏览器的特定请求。C HttpFilter类可以用来寻找并作用于那些可以通过服务器指定的通信。2.10 其他类1. 调试类C MemoryState类能帮助你正确指出内存泄漏。通过创建一个C MemoryState对象,并调用CheckPoint ( )成员函数,可获得内存的瞬态图;在稍后时刻,用另外一个C MemoryState对象获得另外一个瞬态图,并比较结果。在应用程序的调试版,D EBUG_NEW宏利用这些类自动定位内存泄漏。CException (0)类是M FC处理C ++意外事故的设备。有11个派生于C Exception的类,用来处理列在下面表格中的意外事故:M FC类C ArchiveExceptionC DaoExceptionC DBExceptionC FileExceptionC InternetExceptionC MemoryExceptionC NotSupportedExceptionC ResourceExceptionC UserException意外事故使用C Archive类的错误使用C DaoDatabase类的错误使用C Database类的错误使用C File类的错误任何I nternet类的错误任何内存错误试图使用一个不支持的函数试图定位或配置一种资源通常用来提示用户发生了某种例外处理意外可以使用下面模板:T RY{// attempt something risky}30{} 第一部分基础知识下载C ATCH(CUserException, e)//handle exception A ND_CATCH(CMemoryException, e){ //handle another exception} C AT CH_ALL(e){ //handle all exceptions} E ND_CAT CH 2. 同步类 在多线程应用程序中,M FC同步类用来防止数据对象被破坏。前面已提及,一个M FC应用程序可以同时运行多个线程。如果不止一个这样的线程同时修改相同的数据对象且同时把该数据保存到相同内存地址时,便有可能破坏该数据。 在一个多线程应用程序中,四个M FC类和两个M FC辅助类帮助同步数据存取。 C Mutex用来防止多个线程同时访问同一数据对象。要启用C Mutex,先要把它添加到数据类的成员变量;接着构造另一个M FC类,即C SingleLock,对任何访问这些成员变量的成员函数引用C Mutex;然后调用C SingleLock的Lock (int timeout)成员函数。如果别的线程已在访问该数据,则Lock ( ) 函数不返回,直到该线程调用Unlock ( )或超时时才返回。C MultiLock类允许指定多个C Mutex对象,以便能同时服务多个访问(见图2 -4)。 数据类对象 线程1 线程2 ①线程1保存数据 ②线程2一直在Lock( )处等待,一直等到线程1完成任务或时间超过3分钟 图2-4 用CMutex和CSingleLock同步数据访问 C Semaphore与C Mutex类基本相同,但是,前者允许同时存在一个或多个同时发生的 与C Mutex类基本相同,但是,前者在堆栈中被构造,并有比C Mutex 访问。C SingleLock和C MultiLock用法如前。 C CriticalSection更快的速度。 C Event 基于任何事件(不仅仅是被另一线程访问)对数据访问进行同步。线程将一直等 待,直到调用C Event的SetEvent ( )和ResetEvent ( )成员函数允许它们继续为止。 3. 沙漏光标类C Wa itCursor 可以方便地将鼠标变为一个沙漏标来指示系统忙。C Wa itCursor通常在一 个费时任务之前在堆栈中构造,在该任务期间禁止输入。然后,当函数返回时,C Wa itCursor 下载自动析构,而沙漏消失(见例3 4)。 第2章类312.11 小结 在本章中,我们已经了解了一些M FC类库必须为应用程序提供的类,这些类包括: ■■■■■ 用以创建应用程序的类。创建用户界面的类。帮助应用程序绘图的类。 处理数据集合、数据库和二维文件的类。允许在网络或因特网上通信的类。 我们也简单涉及到类是怎样应用消息和C CmdTa rg et类进行互相通信的,在下一章中将更进一步来探究该主题。 因篇幅问题不能全部显示,请点此查看更多更全内容