MFC类的组织结构及主要的类简介

来源:互联网 发布:263工程数据 编辑:程序博客网 时间:2024/05/29 09:13
8.2.1 MFC类的组织结构
    目前的MFC版本中包含了100多个类,不同的类实现不同的功能,类之间既有区别又有联系。MFC同时还是一个应用程序框架,它帮助定义应用程序的结构以及为应用程序处理许多杂务,事实上,MFC封装了一个程序操作的每一个方面。在MFC程序中,程序员很少需要直接调用Windows API函数,而是通过定义MFC类的对象并通过调用对象成员函数来实现相应的功能。
    MFC类库中类是以层次结构的方式组织起来的,几乎每个子层次结构都于一具体的Windows实体相对应,一些主要的接口类管理了难以掌握的Windows接口。这些接口包括:窗口类、GDI类、对象连接和嵌入类(OLE)、文件类、对象I/O类、异常处理类、集合类等。
    MFC库中的类之间按层次关系划分可分为如下若干类:
    (1)根类:Cobject
    (2)应用程序体系结构类
        应用程序和线程支持类
        命令相关类
        文档类
        视类(体系结构)
        框架窗口(体系结构)
        文档模板类
    (3)窗口、对话框和控件类
        框架窗口类(窗口)
        视类(窗口)
        对话框类
        控件类
        控件条类
    (4)绘图和打印类
        输出(设备相关类)
            绘图工具类
    (5)简单数据类型类
    (6)数组、列表和映射类
         数组类
         列表类
         映射类
    (7)文件和数据库类
         文件I/O类
         DAO类
         ODBC类
    (8)Internet和网络工作类
         ISAPI类
         Windows Socket类
         Win32 Internet类
    (9)OLE类
         OLE容器类
         OLE服务器类
         OLE拖放和数据传输类
         OLE普通对话框类      
         OLE控件类
         OLE动画类
         活动文档类
         其他文档类
    (10)调试和异常类 
         调试支持类
         异常类
   下面简单介绍一下MFC中一些主要的类和某些子层次结构。

8.2.2 根类
    Cobject类是MFC的抽象基类,是MFC中多数类和用户自定义子类的根类,它为程序员提供了许多编程所需的公共操作。这些操作包括:对象的建立和删除、窜行化支持、对象诊断输出、运行使信息以及合类的兼容等。
    窜行化是对象本身往返于存储介质过程。窜行化的结果是使数据“固定”在介质上。Cobject类定义两个在窜行化操作中起重要作用的成员函数:Serialize和IsSeializable。程序可以调用一个由Cobject派生的对象的IsSeializable函数来确定该对象是否支持窜行化操作。建立一个支持窜行化的类的步骤之一是重载继承自Cobject类的Serialize函数,并提供窜行化数据成员的派生的专用代码。
    Cobject的派生类同时还支持运行时类型信息。运行时类型信息机制允许程序检索对象的类名及其他信息。Cobject提供两个成员函数来支持运行时的类型信息;IsKindOf和GetRuntineClass。函数IsKindOf指示一个对象是属于规定的类或者是从规定的类中派生出来的。CRuntimeClass类对象中包含了一个类的运行时信息,包括这个类的类名,基类名等信息。通过它可以很容易获得一个指定的运行时刻信息。

8.2.3 应用程序体系结构类
    该类用于构造应用程序框架的结构,它能提供多数应用程序公用的功能。编写程序的任务是填充框架,添加应用程序专用的功能。应用程序体系结构类主要有与命令相关的类,窗口应用程序类,文档/视图和线程基类等。
    CWinApp表示应用程序本身,几乎所有的基于MFC的应用程序都是从它派生一个类,并通过创建这个派生类的对象来创建一个应用程序对象。CWinApp类继承关系如图8-1所示。
1. 命令相关类:CCmdTarget类
    该类是Cobject的子类,它是MFC库中所有具有消息映射属性的基类。消息映射规定了当一个对象接收到消息命令时,应调用哪一个函数对该消息进行处理。程序员很少需要从CCmdTarget类中派生出新类如窗口类(CWnd),应用程序类(CWinApp),视图类(Cview)及框架窗口类(VFrameWnd)等。
2. 线程基类:CWinThread类
    所有线程的基类直接使用。它封装操作系统的线程化功能。CWinTread对象表示一个执行的线程,成员函数如CreateThread,SetThreadPriority和SuspendThread提供MFC程序用来创建和操作线程的工具。CWinApp类就是从CWinThread类中派生的。
3. 窗口应用程序类:CWinApp类
    每个应用程序有且只有一个应用程序对象,在运行程序中对象与其他对象相互协调,该对象从CWinApp类中派生。CWinApp类封装了初始化,运行,终止应用程序的代码。
    CWinApp类中包含了若干个共有的数据成员,部分数据成员如表8-1所示。

                        表8-1 CWinApp类中定义的部分数据成员
     数据成员                                           功能描述
  m_pszAppName                                      保存应用程序的名称
  m_hInstance                                       标识当前的应用程序实例
  m_lpCmdLine                                       指向应用程序的命令行参数的指针
  m_nCmdShow                                        指定窗口初始化的风格
  m_bHelpMode                                       指定在用户按下Shift+F1键时是否作出相应的帮助响应
  m_pActiveWnd                                      指向容器应用程序主窗口的指针
  m_pszExeName                                      应用程序可指向文件模块的名称
  m_pszHelpFilePath                                 应用程序的帮助文件的路径
  m_pszProfileName                                  应用程序初始化(.ini)文件名
  m_pszRegistryKey                                  决定应用程序的初始化文件的存放地点
    CWinApp类中包含了若干公有的成员函数,部分如表8-2所示
                                      表8-2 CWinApp类中的公有成员函数
                函数名                                  功能描述
        CWinApp                                   构造应用程序对象
        LoadCursor                                向应用程序中加载光标资源
        LoadStandardCursor                        向应用程序中加载系统默认的光标资源
        LoadIcon                                  向应用程序中加载图标资源
        LoadStandardIcon                          向应用程序中加载系统默的图标资源
        ParseCommandLine                          对命令行中的参数和标志进行分析
        ProcessShellCommand                       处理命令行中的参数和标志
        GetProfileInt                             从程序的ini文件中获取一个整数值
        WriteProfileInt                           向程序的ini文件中写入一个整数值
        GetProfileString                          从程序的ini文件中获取一个字符值
        WriteProfileString                        向程序的ini文件中写入一个字符值
        AddDocTemplate                            向应用程序的文档模板列表中加入一个文档模板
        GetFirstDocTemplatePosition               获取文档模板列表中第一个文档模板的位置
        OpenDocumentFile                          打开一个文档对象
        InitInstance                              执行程序的初始化操作
        Run                                       启动默认的消息循环
        OnIdle                                    应用程序闲置时的出来程序
        ExitInstance                              结束应用程序的操作
        CloseAllDocument                          关闭所有打开的文档对象
        SaveAllModifiled                          提示保存修改过的文档对象
        SetDialogBkColor                         设置对话框的默认背景色
      CWinApp中定义的部分函数功能又是也可以通过MFC提供的全局函数来实现,这些全局函数一般都以Afx为前缀。

4. 文档/视图类
    文档对象由文档模板对象创建,管理应用程序的数据。Cdocument支持标准的文档操作,这些操作包括文档的创建,下载保存。一个应用程序可以操作多个文档类型,每一个文档类型都有特定的文档模板。文档模板指定了该文档所需的资源,而且每一个文档对象包含一个指向起相联的文档模板的指针。这些模板及类由:
    CDocTemplate:文档模板基类。文档模板是协调文档,视图和框架窗口的创建。
    CSingleDocTemplate:单文档界面的文档模板。
    CMultiDocTemplate:多文档界面的文档模板。
    Cdocument:应用程序专用文档的基类。
    Cview:显示文档模板数据的应用程序专有的视图基类


    Cdocument类诶用户自定义的文档类提供了基本的功能支持,它在MF从中的层次关系如图8-2表示。用户通常用File Open命令打开一个文档,用File Save命令来保存文档,基于这些文档的共性,MFC提供了一个Cdocment类来对此进行封装。
    用户通过和文档相关联的视图对象与文档进行交。一个视图显示文档中的信息,并把用户在框架窗口的操作转换成对文档操作的相应命令。文档模板指定了视图的类型和显示每种文档的对于窗口。
    视图类为用户自定义视图提供了最基本功能的支持。一个视图充当了沟通用户和文档的中间桥梁的作用。
在MFC类库中一部分是从Cview类派生出来的,如表8-4所示。

                            表8-4  Cview的派生类
               派生类名                                       功能简介
             Cscrollew                                   带有滚动条的视图
             CCtrlView                                   带有树状,列表框等控件的视图
             CDaoRecordView                              在一个对话框中显示数据库记录的视图
             CEditView                                   一个通过多行文本编辑器的视图
             CListView                                   带有列表框控件的视图
             CRecordView                                 在一个对话框中显示数据库的视图
             CRichEditView                               一个具有格式文件编辑功能的编辑控件的视图
             CTreeView                                   一个具有树状控件的视图
             CPreviewView                                支持打印预览

    当一个文档中数据被修改时,每一个与此文档相关联的视图都必须反映出来所作的更改。Cdocument类提供了一个UpdateAllView成员函数来修改所有和文档有关的视图。当应用程序中使用该类时,必须实现一下步骤:
   (1)从Cdocument为每一种文档类型派生一个子类
   (2)添加成员变量一储存文档数据
   (3)实现对文档数据进行读写,修改的成员函数
   (4)在用户种定义的文档中重载Cobject::Serialize成员函数以实现从磁盘上对文档数据的读写。

8.2.4 可视对象类
1. 窗口类:CWnd类
    该类提供了MFC中所有窗口类的基本功能。CWnd类和消息映射机制隐藏了窗口函数WndProc。一个Windows消息通过消息映射发送到相应的CWnd类OnMessage成员函数。程序员可以重载OnMessage成员函数以对特定分消息进行处理。CWnd类是CCmdTarget类的子类,创建Windows窗口要分两步走:首先引入构造函数,构造一个CWnd对象,然后调用Create建立Windows窗口并将它连到CWnd对象上。MFC中还从CWnd类派生出了进一步的窗口类型以完成更具体的窗口创建工作,这些派生类有:
         CFrameWnd:框架窗口类,SDI应用程序主要框架窗口的基类。
         CMIDFrameWnd:多文档框架窗口类,MDI应用程序主框架窗口的基类。
         CMDIChildWnd:多文档框架窗口类,MDI应用程序文档框架窗口的基类。
2. 视类:Cview类
    该类表示框架窗口的客户区和显示文档数据并接收输入的客户区,其派生类主要有如下几种:
         CScrollView:具有滚动条功能的视的基类。
         CFormView:其布局在对话框中定义的滚动视。
         CEditView:具有文本编辑,查找,替换和滚动功能的视。
3. 菜单类:Cmenu类
    该类是Cobject类的子类,它提供一个面向对象的菜单界面。它是一个WindowsHMenu的封装,提供了与窗口有关的菜单资源建立,修改,跟踪及删除的成员函数。
4. 对话框类:Cdialog类
    由于对话框是一个特殊的窗口,所以该类是从CWnd中派生出来的。对话框子层次结构包括通用对话框类Cdialog以及支持文件选择,颜色选择,字体选择,打印,替换文本的公共对话框子类。这些子类包括:
         CFileDialog:提供打开或保存的标准对话框。
         CColorDialog:提供选择一种颜色的标准对话框。
         CFontDialog:提供选择一种字体的标准对话框。
         CPrintDialog:提供打印一个文件的标准对话框。
         CFindReplaceDialog:提供一次查找并替换操作的标准对话框。
         Cdialog:该类可用于建立模态和非模态对话框模型,是该子层次结构的根。
5. 控件类
     控件子层次结构包括若干类,使用这些类可建立静态文本,命令按钮,位图按钮,列表框,组合框,滚动条,编辑框等。主要控件类如下:
         Cstatic:静态文本控件窗口。常用于标注,分隔对话框或窗口的其他控件。
         Cbutton:按钮控件窗口。该类为对话框或窗口的按钮,检查框或单选按钮提供一个总的接口。
         Cedit:编辑框控件。编辑框控件用于接收用户的文字输入。
         CScrollBar:滚动条控件。提供控件条的功能,用作对话框或窗口中的一个控件,用户可通过它在某一个范围定位。
         CListBox:列表框控件。列表框用于显示一个组列表框,用户可以移动游标选择一个值或一个范围。
         CComboBox:组合框控件。组合框由一个编辑框控件加一个列表框组成。
         CBitmapButton:带有位图而非文字标题的按钮。
6. 控件条类:CControlBar
    控件条子层次结构为工具条,状态条,对话框和分割窗口建立模型。该类是CToolBar,CStatusBar,CDialogBar的基类,负责管理工具条,状态条,对话框的一些成员函数。控件条指的是连接在主窗口框架的顶部或底部的小窗口,它具有如下基类:
         CStatusBar:状态条控件窗口的基类。
         CToolBar:包含非基于HWND的位图式命令按钮的工具条控件窗口。
         CDialogBar:控件条形式的非模态对话框。
7. 绘画对象类:CGdiObject类
    图形绘画对象子层次结构以CGdiObject类为根类,可用于建立绘画对象模型,如画笔,画刷,字体等。这些子类有:
         Cbitmap:封装一个GDI位图,提供一个操作位图的接口。
         Cbrush:封装一个GDI画刷,可选择为设备描述表的当前画刷。
         Cfont:封装一个GDI字体,可选择为设备描述表的当前字体。
         Cpen:封装一个GDI画笔,可选择为设备描述表的当前画笔。
8. 设备描述表类:CDC类
    该类及其子类支持设备描述表对象,是Coject类的子类。CDC类是一个较大的类,包括许多成员函数,如映射函数,绘画工具函数,区域函数等,通过CDC对象的成员函数可以完成所有的绘画工作,它的子类具体请看p187页介绍。

8.2.5 通用类
    通用类提供了许多服务,例如文件I/O,诊断和异常处理类,此处还包括数组和列表等存放数据集的类。
1. 文件类:Cfile类和Carchive类
    如果想编写自己的输入/输出处理函数,可以使用Cfile类和Carchive类,一般不必再从这些类中派生新类。以下是部分文件类:
         Cfile类:提供访问二进制磁盘文件的总接口,Cfile对象通常通过Carchive对象被间接访问。
         CStdioFile类:提供访问缓存磁盘文件的总接口,通常采用文本方式。
         VMemFile类:提供访问驻内存文件的总接口。
         Carchive类:与Cfile对象一起通过窜行画实现对象的永久存储。
2. 异常类:Cexception类
    该类是所有异常情况的基类,供C++的try/thow/catch异常处理机制使用,它不能直接建立Cexception对象,程序员只能建立派生类对象。可以使用派生类来捕获指定的异常情况,Cexception的派生类如下:
         CNotSupportedException:不支持服务异常。
         CMemoryException:内存异常。
         CFileException:文件异常。
         CResourceException:资源异常。
         COleException:OLE异常。
         CDBException:数据库异常。
         CUseException:终端用户操作异常。
    产生异常的原因描述将储存再异常对象的m_cause数据成员中。
3. 模板收集类
    这些类可以将对象存放到数组,列表和映射中。单这些收集类是模板,它们的参数确定了存放在集合的对象类型。Carray,Cmap和Clist类使用全局帮助函数,帮助函数通常必须定制。类型指针是类库中其他类的包装类,利用这些包装类,应用程序可借助于编译器的类型检查以避免出错,下列是部分模板收集类:
         Carray类:将元素存储在数组中。
         Cmap类:将键映射到值。
         Clist类:将元素存储在一链表中。

8.2.6  OLE类
    OLE是处理复合文档的一种方法,代表对象链表和嵌入技术。所谓复合文档,就是在一个文档中同时保存了如文本,图像和声音等多种不同类型的数据,而这些数据又可以通过不同程序不同格式产生。
    MFC中提供了对OLE技术体系的全方位的支持。它提供OLE基类,可视编辑容器类,可视编辑服务器类,数据传送类,OLE对话类和杂项等六种类来封装OLE技术。
    目前基于OLE的类比较丰富。主要有:
    普通类:COleDocument,COleItem,COleException为支持的普通类。
    客户类:COleClientDoc,COleClientItem为支持的OLE客户类。
    服务类:COleServer,COleTemplate,COleServerDoc,COleServerItem为支持的OLE的服务类。
    可视编辑容器类:COleClientItem及COleLinkingDOC提供用于OLE容器的基础结构区支持可视编辑类。
    数据传送类:COleDropSource,COleDropTarget,COleDataSource和COleDataObject封装拖放操作及通过剪贴板进行数据传送操作。
    对话类:COleInsertDialog显示标准的OLE对话框。
    杂项类:如CRectTracker,它围绕一个插入在复合文档中的项建立边框,这样可使该项移动和调整大小。

8.2.7  ODBC数据库类
    为了支持向带有ODBC驱动程序的各种数据库管理系统提供标准化界面ODBC标准,MFC提供了Cdatabase和Crecordset类。Cdatabase封装对一数据源的连接,通过此连接应用程序可在该数据源上进行操作,Crecordset类封装了从一数据源选出一组记录。ODBC子层次结构提供了一些类支持ODBC特征,同时,这些类封装了ODBCAPI,并允许用户继承自Crecordset类的成员函数把存储在数据库中的数据作为被查询,更新和其他方式操作的对象来处理,即通过这些类可开发数据库应用程序类访问多个数据库文件。该层次结构中主要包括的类有:
    CRecordView:它由CFormView派生,该类将记录对象连接到显示当前记录的字段值的一个表单视图来简化操作。
    CFileExchange:提供上下文信息,支持记录字段交换,即在字段数据成员,记录对象的参数数据成员及数据源上的对应列表之间进行数据交换。
    CLongBinary:封装一存储句柄,用于存储二进制的对象,例如位图等。
    CDBException:记录数据存取处理过程的失败产生的异常。