VC文档各个类关系

4 篇文章 0 订阅

                          VC 6.0 文档视图结构

一、概述

 

       文档/视图结构是在Visual C 中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的对象――文档和视图负责的。具体地说,用户对数据所做的任何改变都是由文档类负责管理,而视图通过调用此接口实现对数据的访问和更新。

       本节围绕这一结构的各个环节展开计论,因为理解这一结构的原理和机制对基于文档/视图结构的MFC应用开发具有重要作用。

 

      

二、正文

1 文档/视图结构

文档/视图结构提供了一种连续处理数据的方式,它使应用程序的数据与数据的显示分开处理。在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。

 

1.1    文档/视图结构简介

MFC提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列启动文件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员在程序中补充完善,开发人员只需要完成针对待定应用的代码。其中最重要的框架就是其于文档/视图结构的文档应用程序框架。

在文档/视图结构中,程序的数据储存在文档类中(作为文档类的数据成员),是对数据的抽象表示。数据显示由视图负责,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在窗口,用户通过视图与程序交互。

文档,视图和框架三者之间是相互关联,相互协调的,彼此都包含了指向对方的指针。文档、视图与框架的关系,如图1.01所示。

     

                     1.01

一个文档可以对应多个不同视图,而一个视图一般只能对应一个文档。当文档数据发生变化时,视图显示的状态也会随之变化;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。

 

1.2    MFC文档/视图结构相关的类

一般情况下,采用文档/视图结构的应用程序到少应由以下对象组成:应用程序对象(CWinApp类派生的对象),框架窗口对象(CFrameWnd类派生的对象),文档对象(CDocument类派生的对象),视图对象(CView类派生的对象)。另外,还必须有一个负责管理文档和视图的文档模板类(CDocTemplate)。

其中的主角是CDocument类(文档类)和 CView类(视图类),这就是文档/视图结构的由来。各类的作用分别介绍如下:

 

1.       CWinApp

CwinApp类提供了用户与Windows应用程序之间进行交流的界面。在生民这个类的对象后,这个对象自动地把自身与Widnows系统建立联系,接收WINDOWS传送的消息,并交给程序中相应的对象去处理,免去了程序员许多的工作,使得开发C Windows程序变得简单方便。

这个类中除了有一般类都有的构造函数外,还有一个重要的成员函数:INITINSTANCE,Windows环境下,可以运行同一程序的多个实例,函数INITINSTANCE的作用是在生成的一个新的实例的时候,完成一些初始化的工作。

 

2.       CFrameWnd

CFrameWnd类(框架窗口类)是应用程序的框架窗口。所谓框架窗口是指包括菜单、工具栏、状态栏和窗口客户区的整个应用程序的主窗口,相当于简单应用程序框架中所提到的主窗口。

MFC程序中,一般并不需要经常对CFrameWnd类进行操作,更多的是对视窗类进行操作,达到对程序中的数据进行编辑的修改的目的。

 

3.       CView

CView类派生于Cwnd类,用于管理文档/视图结构中的窗口客户区,这个窗口在文档/视图结构中称视。视图类专门用于对应用程序的数据进行显示,在视图类中有一个很重要的函数OnDraw(),OnDraw()函数是用于进行应用程序数据显示的函数,一般在派生类中要重写这一个函数。

在文档/视图结构中,重写的OnDraw()函数首先清空客户区窗口,然后再在窗口上绘制客户需要的内容,也就是说,OnDraw()函数将集中管理所有的数据显示工作。

 

4.       CDocument

虽然视类负责应用程序数据的显示,但应用程序的数据一般不直接由视图类管理,而是作为文档类(CDocument)的数据成员,由文档类来进行集中管理,而且文档类将直接与磁盘相联系,把文档类中的数据存盘,或从磁盘中取出存盘的数据。

视图类用OnDraw()函数展示数据,但应用程序的数据却存放在文档类中,视图类的函数GetDocument()的返回值就是指向文档类的指针,通过这个指针就可以访问到文档类中的公有数据成员。

         文档类的数据要存盘或取盘要与磁盘进行数据传递,可以用CFile类结合CFileDialog类实现。在文档/视图结构中,通过文档类中的序列化函数Serialize()就可以很简单的完成数据存取任务。

         文档/视图结构中,数据的传输过程如图1.02所示。

 

 

 

 

 

 

 

 

 

                    

5 CDocTemplate

文档模板类(CDocTemplate)的作用是连接文档/视图结构中文档类,视图类和框架窗口类之间的关系,文档类,视图类和框架窗口类之间的关系是在文档模板类中建立起来的,同时文档模板类还加载了菜单以及与菜单资源使用一个ID的快捷键等资源;

具体来说,在CWinApp派生类的InitInstance()函数中建立了文档模板类CDocTemplate,并用文档模板类连接资源、框架窗口、文档和视图。

 

 

2          单文档应用程序框架分析

2.1    单文档应用程序框架所使用的类

 

2.01单文档应用程序框架所使用的类

 

 

其中各个类的由来及主要实现功能如表2-01所示。

 

2-01  单文档工程中的各个类及其主要功能

 

另外还有一个派生自CDocTemplate类的CSingleDocTemplate类,它出现在CSDocDemoAppInitInstance( )函数中,用于耦合资源、框架窗口、文档视图。

 

 

2.2    单文档应用程序框架的简单实现过程

文档视图结构的应用程序框架的实现过程中,应用对象(CSDocDemoApp)负责创建文档模板(CSubgkeDocTemplate),而文档模板负责创建文档(CSDocDemoDoc)和框架窗口(CMainFrame),框架窗口负责创建视图对象(CSDocDemoView),其先后顺序如下:

 

应用对象-> 文档模板> 文档> 框架窗口> 视图

 

应用程序首先从应用对象CSDocDemoApp执行,它有一个重要的实例化入口函数InitInstance() 函数,实现如下:

 

 

 

CSingleDocTemplate的构造函数参数据括资源ID(菜单和加速键等)以及3个指向CRuntimeClass结构的指针,它是由宏RUNTIME_CLASS而获取。这3CRuntimeClass为在创建文档期间创建指定类对象(文档,框架,视图)提供所必需的信息。

 

模板对象保存了文档和对应的视图和框架窗口的CRuntimeClass对象的指针,因此在创建或找开一个文档时,就可以决定需要什么样的视图、框架窗口来显示它。

 

而框架窗口在创建时就创建了视图,该过程被MFC封装了。而文档类和视图类之间的交互关系可以表示如下。

 

 

               2.02  单文档应用程序各类之间的关系图

 

 

三、文档/视图结构开发基础

1 CDocument类及其常用函数

       在基于文档/视图结构的应用程序中,CDocument类的派生对象负责对象读入,保存和管理应用程序的数据。每个文档类可能与多个视图类关联,而每个视图包含一个指向与其相关的文档的指针。

       文档类允许向其中增加数据成员,应用程序的数据可以是任何类型的,或者是任何自定义的数据结构,如结构体,类或链表等。CDocument类中的常用函数及实现的功能如表3-01所示。

 

        CView类及其常用函数

视图类对象代表了应用程序的窗口客户区,是文档信息的一个显示窗口,它同时也是用户与程序之间信息交互的桥梁。用户对数据的编辑和修改需要通过键盘或鼠标进行,这些消息都由视图类接受后再反映到文档类。

CView类提供了向视图或打印机进行输出的基本框架,决定了视图的基本特性,派生的视图类可以重载基类的函数,或增加新的函数以决定特定视图的特性。

CView类的常用函数及实现的功能如表 3-02所示。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值