单文档和多文档(一)

1.单文档和多文档的概念

VC的MFC库支持三种不同的应用程序
1)单文档界面(SDI)
2)多文档界面(MDI)
3)基于对话框的应用程序
SDI的应用程序只有一个窗口,比如记事本,MDI的应用程序每次可以读写多个文件或文档,可同时对多个文档进行操作,可以有多个子窗口,比如word。使用appwizard创建单文档和多文档界面的应用程序的过程几乎是一样的。
两者的区别在于:
1)在创建SDI界面的应用程序时,不生成CChildFrame类,CMainFrame类的基类为CFrameWnd。
2)在创建MDI界面的应用程序时,CMainFrame类的基类为CMDIFrameWnd。

由于每个文档可以有多个视图,但每个视图只能对应于一个确定的文档。视图是文档的不同的表现形式,比如,一个*.html语言的文件,在浏览器里和在记事本里打开的表现形式是不同的,但它们操作的是同一个文档,这就是一个文档对应两个视图。

多文档程序需要解决的问题仅仅是多个文档的数据管理方法的问题。

多文档程序,最初的文档模板只支持主窗口,但每次打开一个新文档时都调用CDocument的函数OnNewDocument,建立一个由CMDIChildWnd派生的新的MDI子窗口,这些窗口中保存着各种已经打开的文档,所有的细节都由MFC库处理。

2.文档视图结构

在文档/视图结构中,文档对数据进行管理和维护,数据保存在文档类的成员变量中。
文档类通过串行化的过程将数据保存到磁盘文件或者数据库,文档类还可以处理来自菜单、工具栏按钮和快捷键的WM_COMMAND消息,除WM_COMMAND消息外,文档不能处理其它的的windows消息。
由此看出命令消息可以被多种对象处理,这些对象除窗口和视图外,还可以是文档、文档模板或者是应用程序本身,这点与Windows消息和控件通知消息不同,因为Windows消息和控件通知消息只能被窗口和视图处理。

视图在文档和用户之间起中介作用,它可以接受用户的输入并接受用户的修改。修改是通过调用文档和视图的接口将修改的信息反馈给文档类,实际的数据更新仍然是由文档来完成的。

视图可以直接或者间接的访问文档类中的成员变量,它从文档类中而不是从存储介质中将文档中的数据读出来,然后在屏幕上显示文档的数据。

3.文档视图结构的工作机制

视图通过GetDocument成员函数获得指向相关联的文档对象的指针。通过该指针调用文档类的成员函数来从文档中读取数据。视图把数据显示在计算机屏幕上,用户通过与视图的交互来查看数据并对数据进行修改。视图通过相关联的文档类的成员函数将经过修改的数据传递给文档对象。文档对象获得修改过后的数据后,对其进行必要的修改,最后保存到永久介质中,比如磁盘。

4.文档类

CDocument父类是CCmdTarget,CCmdTarget的父类是CObject。

CDocument的一般方法
GetTitle() 获得文档的标题
SetTitle() 设置文档的标题
GetPathName() 获得文档数据文件的路径字符串
GetPathName() 设置文档数据文件的路径字符串
GetDocTemplate() 获得指向描述文档类型的文档模板的指针
AddView() 对与文档相关联的视图列表添加指定的视图
RemoveView() 从文档视图列表中删除视图
UpdateAllViews() 通知所有视图,文档已经被修改,它们应该被重画
DisconnectViews() 使文档与视图分离
GetFile() 获得指向CFile类型的指针
CDocument的虚拟方法
OnNewDocument() 由MFC调用来建立文档
OnOpenDocument() 由MFC调用来打开文档
OnSaveDocument() 由MFC调用来保存文档
OnCloseDocument() 由MFC调用来关闭文档
CanCloseFrame() 确认观察文档的观察窗口是否被允许关闭
DeleteContents() 在为撤销文档对象时删除文档数据
ReleaseFile() 释放文件已允许其它应用程序使用
SaveModified() 查询文档的修改状态并存储修改的文档
Ismodified() 确认文档从它最后一次存储后是否被修改过
SetModifiedFlag() 设置文档从它最后一次储存后是否被修订过的布尔值
GetFirstViewPosition() 获得视图表头的位置
GetNextView() 获得视图列表的下一个视图

CDocument类的派生类构造的基本步骤,一般来说,从CDocument类派生自己的文档类所需的典型步骤为:
1)为每一个文档类从CDocument类(当然也可以是其它CDocument类的派生类)派生一个相应的文档类。
2)为文档类添加成员变量,这些成员变量用来保存文档的数据,其它对象(如与文档相关联的视图)直接或间接的访问这些成员变量来读取或更新文档的数据。
3)重载Serialize成员函数,实现文档类型的串行化。

5.视图类

CView父类是CWnd。
CView的一般方法:
GetDocument() 获得指向与视图相关联的文档的指针
OnPreparePrinting() 设置打印预览

CView的虚拟方法:

IsSelected() 确定文档是否被选中
OnScroll() 当用户滚动时,CView的相应
OnInitialUpdate() 在类第一次构造后由MFC调用
OnDraw() 由MFC调用发出文档到设备描述表
OnUpdate() 由MFC调用对文档的修改进行相应
OnPrepareDC() 在调用OnDraw()前允许修改设备描述表由mfc调用

CView类的派生类介绍:
1)CEditView 支持类似编辑控件所要实现的功能,常见的文本操作,基本上都是由该类支持实现的。但该类的直接基类不是CView,而是类CCtrlView。
2)CRichEditView 主要提供Rich文本操作的支持(Rich文本是既可以为文本,也可以为图形的一种特殊格式文本。
3)CTreeView 主要提供树形控件所实现的功能的支持。它使一种数据的显示方式可以更富于变化。
4)CListView 该类与类 CTreeView一样,更多的好处在于提供了一种简捷的实现数据的不同显示的途径。
5)CScroolView 它主要提供视图的滚动显示。需要注意的是,该类的直接基类是CView。

6.文档模板类

CDocTemplate类的基类为CCmdTarget。
CDocTemplate类的基本函数说明
GetDocString() 获得与文档相关的字符串
LoadTemplate() 加载指定的模板
AddDocument() 给文档模板添加指定的模板
RemoveDocument() 从文档模板列表中删除文档
GetFirstDocPosition() 获得与文档模板相关的第一个文档的位置
GetNextDoc()获得文档及下一个文档
CreateNewDocument() 建立文档
CreateNewFrame() 建立包含文档和视图的框架窗口
OpenDocumentFile() 打开由路径指定的文档
CloseAllDocument()关闭所有的文档
SetDefaultTitle()显示文档窗口的标题栏中默认的标题
SaveAllModified()查询文档模板的修改状态并存储与之关联的所有文档

在VC中,文档类、与文档类相关联的视图类以及为了视图类提供显示的框架窗口都是由文档模板创建的,每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档
文档、框架窗口和视图创建过程之间的先后顺序为:
创建文档,创建框架窗口,创建视图。

文档、视图和框架三者之间是相互关联、相互协调的,彼此都包含了指向对方的指针。它们之间的联系是通过文档模板的构造函数来实现的。文档模板的构造函数原型如下:
CDocTemplate( UNIT nIDResource.//和文档类型一同使用的各种资源的资源标识符
CRuntimeClass* pDocClass //指向派生文档类的CRuntimeClass对象的指针
CRuntimeClass* CFrameClass //指向派生框架类的CRuntimeClass对象的指针
CRuntimeClass* CViewClass );//指向CView派生视类的CRuntimeClass对象的指针。

文档模板字符串在资源文件中的定义描述了文档模板的信息,它由至多9个子串组成。格式如下:
< WindowTitle > //在SDI应用程序中的标题栏上标题
< DocName > //新文档的默认名
< FileNewName > //文档类型的名字
< FilterName > //匹配此文档类型的文件过滤器
< FilterExt > //文档的文件扩展名
< RegFileTypeID >//存储在寄存器中文档类型的标识符
< RegFileTypeName >//存储在寄存器中文档类型的标识符
<FilterMacExt(FilterWinExt)>//允许从FilterName删除的文件扩展名
<FilterMacName(FilterWinName)>//允许macintosh的文件类型被指定在FilterExt中

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值