VC++课件第5讲文档视图结构

上传人:E**** 文档编号:91267634 上传时间:2019-06-27 格式:PPT 页数:60 大小:420.50KB
返回 下载 相关 举报
VC++课件第5讲文档视图结构_第1页
第1页 / 共60页
VC++课件第5讲文档视图结构_第2页
第2页 / 共60页
VC++课件第5讲文档视图结构_第3页
第3页 / 共60页
VC++课件第5讲文档视图结构_第4页
第4页 / 共60页
VC++课件第5讲文档视图结构_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《VC++课件第5讲文档视图结构》由会员分享,可在线阅读,更多相关《VC++课件第5讲文档视图结构(60页珍藏版)》请在金锄头文库上搜索。

1、大学Visual C+程序设计案例教程,杨琦 计算机教学实验中心 西安交通大学,第4章 文档/视图结构,授 课 内 容,4.1文档/视图概念 - 28 - 4.2 视图类 - 29 - 4.3 文档类 - 29 - 4.4 文档/视图结构中的应用程序类 - 30 - 4.5 文档/视图结构中的框架窗口类 - 31 - 4.6 文档/视图结构中各类对象之间的协作关系 - 31 - 4.7 序列化 - 32 - 4.8 自定义类的序列化 - 32 -,知识点,大部分应用程序要使用数据,其主要工作可以分为类:一是对数据的管理,如存储、复制和查询等任务,一是对数据的处理和输入输出,包括显示和打印。MF

2、C提供了文档/视图结构支持这种应用程序。,4.1文档/视图概念,在框架窗口结构中,文档/视图功能均在框架类中 功能细化 文档可视为一个应用程序的数据元素的集合 视图是数据的用户界面, 通过窗口显示 通过打印机打印 提供用户与文档中数据的交互功能,文档(document)指的是数据组合的抽象,它通常对应磁盘文件,也可以对应I/O端口(包括打印机、键盘)或一块内存空间(串流)。 同样的数据,我们可以用不同的方式来表示。把纯的数据放在文件中或数据库中。而把显示方式分离出来,可以让一份数据有多种不同的显示方式,程序中的数据表现称为“视” 。这样就可以分别考虑数据的保存文档,和数据的表现视。 MFC提供

3、了一种应用程序框架,其核心就是文档/视结构。在三种最基本的MFC程序框架中有两种:多文档结构和单文档结构。MFC采用两个既相互独立又相互紧密联系的类来实现这一结构: 1文档类CDocument,它主要用于存取文档; 2视图类CView,它主要用于显示和打印文档,并支持与用户的交互。,4.1文档/视图概念,文档/视图关系,CView:GetDocument,Document/View(文档/视)互为表里。View本身就是一个窗口,但其外围必须再加上一个框架窗口(这里为CMainFrame)作容器,它是数据的“面”;Document则是数据的“体”。 使用文档/视就是要把数据与它的表现分开,让Do

4、cument专心管理数据,让View专门显示数据。 CView要提供一个GetDocument成员函数来获取与视相关的文档的指针,通过该指针可以存取文件文档中的数据。 下面对模拟程序进行简要说明。,单文档界面与多文档界面,VC的MFC库支持三种不同的应用程序,SDI的应用程序 只有一个窗口,MDI的应用程序每次 可以读写多个文件或 文档,可同时对多个 文档进行操作,可以 有多个子窗口,主要差别,在创建SDI界面的应用程序时,不生成CChildFrame类,CMainFrame类的基类为CFrameWnd,在创建MDI界面的应用程序时,CMainFrame类的基类为CMDIFrameWnd,由于

5、每一个文档可以有多个视图,但每个视图只能对应于一个确定的文档,多文档程序需要解决的问题仅仅是多个文档的数据管理方法的问题,多文档程序,最初的文档模板只支持主窗口,但每次打开一个新文档时都调用CDocument的函数OnNewDocument,建立一个由CMDIChildWnd派生的新的MDI子窗口,这些窗口中保存着各种已打开的文档,所有的细节都由MFC库处理,视图是文档的不同表现形式,一个*.html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 一个文件这就是一个文档对应两视图,4.2 文档/视图结构,在文档/视图结构中,视图通过GetDocument成员函数获

6、得指向相关联的文档对象的指针,通过该指针调用文档类的成员函数来从文档中读取数据,视图把数据显示于计算机屏幕上,用户通过与视图的交互来查看数据并对数据进行修改,视图通过相关联的文档类的成员函数将经过修改的数据传递给文档对象,文档对象获得修改过的数据之后,对其进行必要的修改,最后保存到永久介质(如磁盘文件)中,文档/视图结构的工作机制,SDI程序中文档、视图对象的创建过程,SDI程序中框架窗口、文档和视图的创建是在应用程序对象的InitInstance()成员函数中通过文档模板类完成的:CSingleDocTemplate * pDocTemplate; /创建单文档模板类对象pDocTempla

7、te = new CsingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc), /CMyDoc是应用程序中的文档类 RUNTIME_CLASS (CMainFrame), /CMainFrame是应用程序中的框架窗口 RUNTIME_CLASS (CMyView) ); /CMyView是应用程序中的视图类AddDocTemplate(pDocTemplate); /加载文档模板类对象到文档模板列表 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); /初始化CCommandLineI

8、nfo对象 if(! ProcessShellCommand(cmdInfo) /据对象中的信息启动程序 return FALSE; m_pMainWnd - ShowWindow(SW_SHOW); m_pMainWnd - UpdateWindow(); /显示和更新窗口,SDI程序的消息传递过程,当用户选择了菜单项,单击了快捷键或工具条按钮,系统就会发送WM_COMMAND消息。框架窗口实际上是大多数WM_COMMAND消息的接受者,但WM_COMMAND消息还可以在视图、文档,甚至应用程序类中被处理。,Doc/View框架的主要成员,Doc/View框架虽然可以调用成百上千个不同的类,

9、但是核心类只有五个: CWinApp CDocument CView CDocTemplate CFrameWnd,4.2 CView类,视图类(CView)是从CWnd类下派生的,视图类具有CWnd的所有功能如:创建、移动、显示和隐藏窗口等。CView类可以接收任何Windows消息,而CDocument类则不行,IsSelected():确定文档是否被选中 OnScroll():当用户滚动时,CView的响应 OnInitialUpdate():在类第一次构造后由MFC调用 OnDraw():由MFC调用发出文档到设备描述表 OnUpdate():由MFC调用对文档的修改进行响应 OnPr

10、epareDC():在调用OnDraw()前允许修改设备描述表由MFC调用,CView主要 虚拟方法,CView类中最常用的是OnDraw函数,该函数在屏幕发生变化或因为焦点的变化需要重绘时调用,没有该函数,就不可能在程序的切换后保证屏幕的正确显示。 注意: 尽量不要在OnDraw之外的函数调用绘图方法,那些方法不会在视图需要重新绘制的时候被自动调用。 若想在数据更新的时强制视图更新,可调用Invalidate方法和UpdateWindow方法来实现。,CEditView:简单的文本编辑器,类似Notepad CListView:基于列表的视图,类似文件夹浏览 CTreeView:基于树状控件

11、的视图,类似文件浏览左侧的树状结构 CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器CScrollView:支持滚动条的视图 CFormView:窗体视图,支持在上边使用对话框控件 CRecordView:连接到ODBC数据库的视图 CDaoRecordView:连接到DAO数据库的视图,CView的子类,4.3 文档类,数据定义 文档类的主要成员函数 OnNewDocument()/初始化的位置 DeleteContents() /消除数据 1删除文档的数据; 2确信一个文档在使用前为空。 SetModifiedFlag() void SetModifiedFlag

12、( BOOL bModified = TRUE ); /设置修改标志 Serialize() OpenDocumentFile(),4.3 CDocument类,最常用的是SetModifiedFlag()和UpdateAllViews()。文档内容被修改后,一般要调用SetModifiedFlag()来设定一个标志。UpdateAllView()刷新所有和文档关联的视图。实际上该函数调用各个视图类的OnUpdate()函数。这样做可以保证各个视图之间的同步。,用户可通过函数GetFirstViewPosition()和GetNextView()得到和文档关联的视图的指针,代码如下: POSI

13、TION pos = GetFirstViewPosition(); /得到视图列表头的位置 While(pos != NULL) CView *pView = GetNextView(pos); /获得视图列表中的视图指针 CDocument类在现在流行的MVC(Modal、View、Control)设计模式中相当于其中的Modal,表示抽象数据模型。 文档最主要的功能如下: l 打开保存文档 l 维护文档相关的视图列表 l 维护文档修改标志 l 通过电子邮件发送文档 用户修改文档数据时,调用SetModifiedFlag方法来标志数据被更改过。当程序关闭该文档关联的最后一个视图的时候,文档

14、会自动提示你保存修改。,从CDocument类派生新的文档类的一般过程如下: 为每一个文档类型从CDocument类派生一个相应的文档类。 为文档类添加成员变量,这些变量主要用来保存文档的数据,并使其它的对象(如视图对象)可以访问这些成员变量,从而实现文档和视图的相互搭配使用。 重载Serialize成员函数,实现文档数据的串行化。,无论是保存文档或是打开文档,应用程序都是通过调用文档类的Serialize串行化成员函数来完成操作的。因此,在大多数情况下,我们都需要重载Serialize成员函数。Serialize成员函数带有一个CArchive类型的参数,这是一个与所打开的文件相关联的对象。

15、一般情况下,总是使用CArchive对象来保存和打开文档。,CArchive对象,CArchive对象是单向的,只用于保存或读取两者之一,不能通过同一个CArchive对象既保存又读取文档。 在框架创建CArchive对象时,已根据用户选择的是 “保存” ( “另存为” )还是 “打开” 来设置了CArchive对象的类型,我们可以使用CArchive类的成员函数IsStoring来检索当前CArchive对象的类型,从而得知用户所期望的操作是保存还是读取,执行不同的操作。,4.4 CWinApp 类,CWinApp类代表主程序,CWinApp本身是不可见的,它负责维护进程的启动、终止、消息循

16、环、命令行参数、资源管理,成员 描述 m_pszAppName 应用程序名 M_lpCmdLine 命令行参数 M_pMainWnd 应用程序主窗口指针 M_pszExeName 可执行文件名 M_pszProfileName 配置INI文件名 M_pszRegistrKey 配置注册表主键值 LoadCursor 加载光标资源 LoadIcon 加载图标资源,部分主要成员,CDocTemplate类,文档模板类在应用程序中有着非常重要的作用,是它将原本独立的文档、视图和框架窗口对象联系在一起,文档模板类负责具体的关联文档、视图、框架的创建,CSingleDocTemplate(单文档模板类),CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMai

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号