9 文档视图结构(1)(OK)_第1页
9 文档视图结构(1)(OK)_第2页
9 文档视图结构(1)(OK)_第3页
9 文档视图结构(1)(OK)_第4页
9 文档视图结构(1)(OK)_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、q 学生信息管理学生信息管理第第9单元单元 文档视图结构文档视图结构我们已经知道,利用MFC向导可以开发二种类型的文档/视图结构的应用程序: q 基于SDI的应用程序用户一次只能打开一个文档;若已经打开一个文档,想打开另一个文档时,必须关闭当前打开的文档。q 基于MDI的应用程序用户一次可以打开多个文档;若已经打开一个文档,又想打开另一个文档时,不必关闭当前打开的文档;它体现了Windows操作系统的多任务特点。9.1 基本概念基本概念一、初识文档和视图一、初识文档和视图 文档:是应用程序的数据元素的集合; 视图:是数据的用户界面:通过窗口显示;通过打印机打印;提供用户与文档中数据的交互功能。

2、9.1 基本概念基本概念图图1文档文档/视图关系示意图视图关系示意图 9.1 基本概念基本概念文档文档/视图结构视图结构数据的维护维护及其显示显示分别由文档文档和视图视图负责。 文档对象:代表打开的一个文件; 视图对象:文档的可视化表现形式。文档文档/视图关系视图关系是一对多的关系,即: 一个文档可以对应多个视图。比如一个*.HTML文件,在浏览浏览器里器里和在记事本中记事本中打开的表现形式是不同的,但操作的是同一个文件。 一个视图只能对应一个文档。9.1 基本概念基本概念视图视图通过GetDocument成员函数获得指向获得指向相关联的文档对象的指针文档对象的指针通过该指针调用文档类的成员函

3、数来从文从文档中读取数据档中读取数据视图视图把数据显示数据显示于计算机屏幕上用户用户通过与视图的交交互互来查看数据,并对数据进行修改视图通过相关联的文档类的成员函数,将经过修改修改的数据数据传递给文档对象文档对象获得修改过的数据数据之后,对其进行必要的修改,最后保存保存到永久介质(如磁盘文件)中二、文档二、文档/视图结构的工作机理视图结构的工作机理图图2文档文档/视图工作流程视图工作流程 三、文档三、文档/视图的协作关系视图的协作关系9.1 基本概念基本概念l文档:文档:数据定义、初始化;l视图:视图:数据显示、修改、交互;在视图类的成员函数中,可以: 访问文档类中的数据:得到指向文档类的指针

4、(pDoc),并通过该指针访问文档类中的数据。 若要刷新显示,需要用Invalidate或InvalidateRect发出重画重画消息,引起对OnDraw的调用。 数据操作与数据显示分离数据操作与数据显示分离。由于数据操作与数据显示分别按标准方法封装于两个不同类型的对象中,因而这两项任务的工作量都被大大简化了,各个对象单独存在,而不是将两种代码混在一起。一般说来,对那些有大量数据需要管理、或数据显示非常复杂的应用,文档视结构显得尤为有用。 许多许多MFC类对公共的文档视图活动提供了大量的帮助类对公共的文档视图活动提供了大量的帮助。例如,对文件的操作(选择文件、打开文件和关闭文件)完全由框架类来

5、管理。用户所需做的仅仅是从数据流中读写所需要的字节,这种工作方法可以省略相同代码的重复编写,而将更多的时间用于编写应用程序的特殊代码上。四、文档四、文档/视图结构的优点视图结构的优点9.1 基本概念基本概念一、框架窗口类一、框架窗口类9.2 主体类介绍主体类介绍1. 框架窗口的组成框架窗口的组成框架窗口包括应用程序主窗口应用程序主窗口和文档窗口文档窗口。q 在单文档的应用程序中,应用程序主窗口和文档窗口是一致的。q 多文档应用程序中的框架窗口包括两个两个:主框架窗口类,从多文档主框架窗口CMDIFrameWnd继承而来。子框架窗口类,从多文档子框架窗口CMDIChildWnd继承而来。框架窗口

6、,可以看作是视图的容器。q 为视图提供可视的边框提供可视的边框包括标题栏、一些标准的窗口组件(最大、最小化按钮、关闭按钮),像一个容器一样把视图包装起来;q 响应标准的窗口消息响应标准的窗口消息包括最大化、最小化、调整尺寸等。当框架窗口关闭时,其中的视图对象也被自动删除。 q 对于框架窗口,程序要完成的主要工作是设置窗口外观,MDI应用程序还要维护活动文档窗口和非活动文档窗口之间的切换,对于框架所围的内容则由视图类来管理。9.2 主体类介绍主体类介绍2. 框架窗口的作用框架窗口的作用q 应用程序框架窗口都是使用“动态建立宏动态建立宏”来动态建立的。q SDI只有一个框架窗口(应用程序主窗口和文

7、档窗口合一),它随着应用程序的运行而创建,随着应用程序的结束而销毁;q MDI框架窗口包含应用程序主窗口和文档窗口:应用程序主窗口:应用程序主窗口:随着应用程序的运行而建立,随着应用程序的结束而销毁;文档窗口:文档窗口:则是在用户打开文档或创建新文档时建立,文档关闭则文档窗口也随之关闭。3. 框架窗口的创建和清除框架窗口的创建和清除9.2 主体类介绍主体类介绍q 对MDI的主程序窗口来说,工具栏、状态栏等都是子窗口。q 特殊的子窗口:MDI客户窗口,它是MDI子窗口的直接父窗口,负责管理应用程序主窗口的客户区以及创建子窗口。每个MDI主窗口都有且仅有一个MDI客户窗口。q MDI子窗口用于容纳

8、视图和文档。在任何时候,最多只有一个子窗口是活动的。其派生类MDI客户窗口,还有自己的子窗口文档窗口。文档窗口同样有自己的子窗口视图。父窗口管理子窗口的定位,并向子窗口传送命令消息。q 在任何情况下,调用AfxGetMainFrame()函数可以获得应用程序的主窗口指针,通过该指针可以对框架窗口进行各种操作。4. 框架窗口的子窗口框架窗口的子窗口9.2 主体类介绍主体类介绍q 常见的交互对象菜单、工具栏和状态栏,它们都是靠框架窗口来管菜单、工具栏和状态栏,它们都是靠框架窗口来管理的。理的。q 工具栏按钮和菜单项的更新:ON_UPDATE_COMMAND_UIq 消息可以在框架窗口类中处理,框架

9、窗口还将状态栏定位在自己客户区的底部,并管理状态栏的显示单元。5. 框架窗口与用户交互对象框架窗口与用户交互对象9.2 主体类介绍主体类介绍若主窗口没有文档窗口,主窗口显示一个缺省的菜单条;否则,主窗口若主窗口没有文档窗口,主窗口显示一个缺省的菜单条;否则,主窗口的菜单条会被当前活动的文档窗口的菜单条取代。的菜单条会被当前活动的文档窗口的菜单条取代。如果如果MDI程序支持多种文档类型,各类型的文档窗口用自身的菜单条来程序支持多种文档类型,各类型的文档窗口用自身的菜单条来取代主窗口的菜单条,并改变主窗口的标题栏。取代主窗口的菜单条,并改变主窗口的标题栏。9.2 主体类介绍主体类介绍6. 对对MD

10、I应用程序,应用程序主窗口管理菜单栏和标题栏应用程序,应用程序主窗口管理菜单栏和标题栏文档类负责管理文档,用户的文档类一般要从文档类负责管理文档,用户的文档类一般要从CDocument继承。该类继承。该类封装了用户定义的文档类的基本功能,它支持标准的封装了用户定义的文档类的基本功能,它支持标准的Windows操作,如操作,如建立建立(New)、打开、打开(Open)和保存和保存(Save)文档等。文档等。9.2 主体类介绍主体类介绍二、文档类二、文档类9.2 主体类介绍主体类介绍1. 派生关系派生关系图图3文档类继承派生关系图文档类继承派生关系图9.2 主体类介绍主体类介绍2. 一般方法一般方

11、法 方法方法说明说明GetTitle()获得文档标题SetTitle()设置文档标题GetPathName()获得文档数据文件的路径字符串SetPathName()设置文档数据文件的路径字符串GetDocTemplate()获得指向描述文档类型的文档模板的指针AddView()对与文档相关联的视图列表添加指定的视图RemoveView()从文档视图列表中删除视图UpdateAllViews()通知所有视图,文档己被修改,它们应该重画DisconnectViews()使文档与视图相分离GetFile()获得指向 CFile 类型的指针9.2 主体类介绍主体类介绍3. 虚拟方法虚拟方法方法说明On

12、NewDocument()由 MFC 调用来 建立 文档OnOpenDocument()由 MFC 调用来 打开 文档OnSaveDocument()由 MFC 调用来 保存 文档OnCloseDocument()由 MFC 调用来 关闭 文档CanCloseFrame()确定观察文档的框架窗口是否被允许关闭DeleteContents()在未撤消文档对象时删除文档数据ReleaseFile()释放文件以允许其它应用程序使用SaveModified()查询文档的修改状态并存储修改的文档IsModified ()确定文档从它最后一次存储后是否被修订过SetModifiedFlag ()设置文档从

13、它最后一次存储后是否被修订过的布尔值GetFirstViewPosition()获得视图列表头的位置GetNextView()获得视图列表的下一个视图9.2 主体类介绍主体类介绍4. 构造文档类的派生类构造文档类的派生类构造构造CDocument类的派生类的典型步骤为:类的派生类的典型步骤为:q 为每一个文档类型从为每一个文档类型从CDocument类派生一个相应的文档类;类派生一个相应的文档类;q 为文档类添加成员变量。为文档类添加成员变量。这些成员变量用来保存文档的数据,其它对象这些成员变量用来保存文档的数据,其它对象(如与文档相关联的视图如与文档相关联的视图)直接或间接地访问这些成员变量

14、来读取或更新文档的数据;直接或间接地访问这些成员变量来读取或更新文档的数据;q 重载重载Serialize成员函数,实现文档数据的串行化。成员函数,实现文档数据的串行化。视图是数据的用户窗口,为用户提供了文档可视的数据显示,它把文档视图是数据的用户窗口,为用户提供了文档可视的数据显示,它把文档的部分或全部内容在窗口中显示出来。的部分或全部内容在窗口中显示出来。视图还给用户提供了一个与文档中的数据交互界面,它把用户的输入转视图还给用户提供了一个与文档中的数据交互界面,它把用户的输入转化为对文档中数据的操作。化为对文档中数据的操作。1. 视图类视图类视图类视图类CView为用户定义的视图类提供了基

15、本的功能,它被连接到文档为用户定义的视图类提供了基本的功能,它被连接到文档上,用作文档和用户之间的媒介。视图是框架窗口的子窗口。上,用作文档和用户之间的媒介。视图是框架窗口的子窗口。视图类视图类CView是是MFC中负责管理视图窗口的基类,其它视图类都由此派中负责管理视图窗口的基类,其它视图类都由此派生。生。CView的主要功能是显示和修改文档的数据,它对文档数据的存储的主要功能是显示和修改文档的数据,它对文档数据的存储没有支持。没有支持。三、视图类三、视图类9.2 主体类介绍主体类介绍9.2 主体类介绍主体类介绍2. 派生关系派生关系图图4视图类继承派生关系图视图类继承派生关系图9.2 主体

16、类介绍主体类介绍3. 一般方法一般方法方法方法说说 明明GetDocument获得指向与视图相关联的文档的指针DoPreparePrinting设置文档标题9.2 主体类介绍主体类介绍4. 主要虚拟方法主要虚拟方法方法方法说说 明明IsSelected确定文档是否被选中OnScroll当用户滚动时,CView的响应OnInitialUpdate在类第一次构造后由MFC调用OnDraw由MFC调用发出文档到设备描述表OnUpdate由MFC调用对文档的修改进行响应OnPrepareDC在调用OnDraw()前允许修改设备描述表由MFC调用 CScrollView:滚动视类; CEditView:

17、编辑视图类; CFormView:一种可以滚动的视图,其中包括了对话框控件; CHtmlView:该类提供了Web浏览器的功能。9.2 主体类介绍主体类介绍 从基类CView派生了如下常用的视图类:5. 视图类的派生类视图类的派生类9.2 主体类介绍主体类介绍四、文档模板类四、文档模板类CDocTemplate类类1. 派生关系派生关系CDocTemplate类的基类类的基类为为CCmdTarget。图图5文档模板类继承派生关系图文档模板类继承派生关系图9.2 主体类介绍主体类介绍2. 基本函数基本函数方法方法说明说明GetDocString ()获得与文档相关的字符串获得与文档相关的字符串L

18、oadTemplate()加载指定的模板加载指定的模板AddDocument ()给文档模板添加指定的模板给文档模板添加指定的模板RemoveDocument ()从文档模板列表中删除文档从文档模板列表中删除文档GetFirstDocPosition()获得与文档模板相关的第一个文档的位置获得与文档模板相关的第一个文档的位置GetNextDoc()获得文档及下一个文档获得文档及下一个文档CreateNew Document()建立文档建立文档CreateNewFrame ()建立包含文档和视图的框架窗口建立包含文档和视图的框架窗口OpenDocumentFile ()打开由路径名指定的文档打开

19、由路径名指定的文档Close All Document()关闭所有文档关闭所有文档SetDefaultTitle()显示文档窗口的标题栏中默认的标题显示文档窗口的标题栏中默认的标题Save All Modified()查询文档模板的修改状态并存储与之关联的所有文档查询文档模板的修改状态并存储与之关联的所有文档9.2 主体类介绍主体类介绍3. 功能功能 在VC中,文档类、视图类以及框架窗口类都是由文档模板创建的。每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档。 文档、框架窗口和视图的创建过程创建过程之间的先后顺序先后顺序为:创建文档;创建框架窗口;1)创建视

20、图。9.2 主体类介绍主体类介绍 CDocTemplate (UINT nIDResource, /资源标识符资源标识符 CRuntimeClass* pDocClass,/指向派生指向派生文档文档类的对象的指针类的对象的指针 CRuntimeClass* pFrameClass, /指向派生指向派生框架框架类的对象的指针类的对象的指针 CRuntimeClass* pViewClass /指向派生指向派生视图视图类的对象的指针类的对象的指针 ); 它们之间的联系是通过文档模板的构造函数文档模板的构造函数来实现的。文档模板的构造函数的原型如下:4. 构造函数构造函数9.2 主体类介绍主体类介绍

21、BOOL CMyEditApp:InitInstance() CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyEditDoc),RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CMyEditView);AddDocTemplate(pDocTemplate); return TRUE;例如,在后面要介绍的的SDI工程MyEdit程序的InitInstance()方法中,通过使用单文档模板的构造函数创建文档模

22、板对象:9.2 主体类介绍主体类介绍BOOL CMymdiApp:InitInstance() CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate ( IDR_MYMDITYPE2, RUNTIME_CLASS(CMymdiDoc2), /MDI派生文档类对象的指针 RUNTIME_CLASS(CChildFrame), /MDI派生子框架类对象指针 RUNTIME_CLASS(CMymdiView2)/MDI派生视图类对象的指针 ); /使用AddDocTemplate()方法将新模板添加到应用程序的

23、文档模板列表中 AddDocTemplate(pDocTemplate2); 而在MDI程序的InitInstance()方法中,通过使用多文档模板的构造函数创建文档模板对象:例1:创建一个基于单文档的简单的文本编辑器。(一)创建基于的(一)创建基于的MyEdit工程工程1.创建一个新的MFC AppWizard(exe)工程,工程名称为MyEdit。 这一节,我们主要通过二个实例二个实例来说明如何创建SDI应用程序。9.3 单文档结构单文档结构一、简单的文本编辑器一、简单的文本编辑器9.3 单文档结构单文档结构图图6新建新建MyEdit工程工程l在AppWizard的第一步中,选择类型为单文

24、档类型。l在AppWizard的第二步、第三步中使用缺省的选项;l在第四步中,单击“高级高级”按钮,弹出Advance Options对话框,在“文件扩展名”编辑框中输入txt2,如下图所示。9.3 单文档结构单文档结构图图7文件的高级选项对话框文件的高级选项对话框 9.3 单文档结构单文档结构以示与以示与.txt文件相区文件相区别别l 按“关闭关闭”按钮。l AppWizard的第五步使用缺省的选项;l 在第六步中,将CMyEditView类的基类设置为CEditView后,按“完成”按钮关闭该对话框。如下图。9.3 单文档结构单文档结构9.3 单文档结构单文档结构图图8设置视图的基类设置视

25、图的基类 利用MFC AppWizard生成一个基于单文档的应用程序后,打开WorkSpace中的ClassView选项页,可以浏览到单文档应用程序的一些核心的组成类,如图所示。理解这些类及其之间的关系是理解该类应用程序的关键。 9.3 单文档结构单文档结构在余下的几步中,全部使用默认值。最后单击“Finish”按钮,生成应用程序框架。 (二)五个类文件(二)五个类文件图图9SDI程序的主要类图程序的主要类图9.3 单文档结构单文档结构 向导生成的单文档应用程序一般包括向导生成的单文档应用程序一般包括5个类个类:应用程序类CMyEditApp:一个从CWinApp类派生的类,是全部应用程全部应

26、用程序的容器序的容器。框架窗口类CMainFrame:一个从CFrameWnd类派生的类。在SDI应用程序中,框架窗口就是应用程序的主窗口,主窗口就是应用程序直接放置于桌面上的那个窗口,每个应用程序只能有一个主窗口只能有一个主窗口,主窗口的标题栏上常常显示应用程序的名称。1.如在记事本程序中,新建一个文件后,主窗口的标题栏上显示“无标题-记事本”。9.3 单文档结构单文档结构文档类CMyEditDoc:从CDocument类继承而来的类,存储应用程序的数据,并将这些信息提供给应用程序的其余部分。视图类CMyEditView:从CEditView类派生而来的,CEditView类提供了基本的文本

27、编辑功能,是从CView类派生来的。视图窗口与其父窗口框架窗口的客户区域对齐,它接收用户对应用程序的输入并显示相关联的文档数据。对话框类CAboutDlg:是从CDialog派生来的,该对话框类显示一个简单的版本信息的“关于”对话框。9.3 单文档结构单文档结构l编译并运行上述程序,显示结果如下图所示。l在客户区中输入一些文本。9.3 单文档结构单文档结构(三)运行程序(三)运行程序9.3 单文档结构单文档结构图图10MyEdit的运行界面的运行界面 l 当单击“文件|新建”,若刚才输入的内容未保存,则出现提示框,询问是否要保存:9.3 单文档结构单文档结构图图11保存提示框保存提示框l 若选

28、择“否”,则放弃原文件,直接创建一个新的空白文件。若选择“是”,则弹出“保存为”对话框,设置相关信息后,即保存文件。(如下图)。(如下图)。9.3 单文档结构单文档结构图图12保存设置对话框保存设置对话框显然,显然,这是一个典型的单文档应用程序,同学们可以观察它是否和记事本程序这是一个典型的单文档应用程序,同学们可以观察它是否和记事本程序的功能类似的功能类似。9.3 单文档结构单文档结构在在MyEdit应用程序的客户区输入一些文本后,可以通过菜单实现一些应用程序的客户区输入一些文本后,可以通过菜单实现一些操作。操作。如,单击如,单击“文件文件|保存保存”,则弹出如下图所示的,则弹出如下图所示的

29、“文件保存文件保存”对话框,对话框,将文件名编辑框中输入一个文件名如将文件名编辑框中输入一个文件名如YYY,则在制定的目录下保存了,则在制定的目录下保存了一个一个YYY.txt2文件。文件。其中其中保存类型保存类型编辑框中出现的的文字就是在图编辑框中出现的的文字就是在图7中的设置所起的作用。中的设置所起的作用。9.3 单文档结构单文档结构5. 保存文档保存文档图图13文件保存对话框文件保存对话框9.3 单文档结构单文档结构在在Window下,当我们直接双击刚才建立的文件下,当我们直接双击刚才建立的文件YYY.txt2,则该文件自,则该文件自动用程序动用程序MyEdit打开,和在打开,和在Win

30、dows下用鼠标双击某个下用鼠标双击某个.doc文件,则文件,则该文件自动用该文件自动用Word字处理程序打开类似。字处理程序打开类似。那么,该功能是怎样实现的呢?那么,该功能是怎样实现的呢?下面让我们定位到下面让我们定位到“应用程序类应用程序类”的的InitInstance()函数中,可以看到下函数中,可以看到下面的代码:面的代码:9.3 单文档结构单文档结构6. 讨论讨论BOOL CMyEditApp:InitInstance()EnableShellOpen(); /使得双击使得双击.txt2文件类型时能调用该工程文件类型时能调用该工程MyEdit打开打开RegisterShellFil

31、eTypes(TRUE); /在注册表中注册文件类型在注册表中注册文件类型.txt29.3 单文档结构单文档结构9.3 单文档结构单文档结构这个例子比较简单,没有涉及深入的操作内容。下面的例子将用到复杂一点的知识。例2:创建一个SDI应用程序,接受用户键盘输入,并在视图窗口中显示,可以实现保存,也可以从文件中读取后显示。l 创建一个新的MFC AppWizard(exe)工程,工程名称为MySDI。1. 每一步选择默认设置即可。9.3 单文档结构单文档结构图图14创建创建SDI工程工程9.3 单文档结构单文档结构在文档类CMySDIDoc中创建键盘输入存储区。当用户击键时,输入的字符数据将添加

32、到一个字符串中,然后在视图中显示该字符串。为此,需要定义一个字符串变量。过程如下。二、向文档类添加成员变量二、向文档类添加成员变量9.3 单文档结构单文档结构图图15添加类成员变量添加类成员变量9.3 单文档结构单文档结构图图16设置成员变量属性设置成员变量属性9.3 单文档结构单文档结构在文档类的构造函数中,将该字符串设置为空。CMySDIDoc:CMySDIDoc()m_strText.Empty();9.3 单文档结构单文档结构由题意,需要重载视图类CMySDIView的二个处理函数: 接受键盘输入的函数:OnChar( ) 显示数据的重画函数:OnDraw( )以OnChar( )为例

33、,说明操作过程。 选择“CMySDIView”,单击右键,弹出菜单,选择Add Windows Message Handler三、向视图类添加处理函数三、向视图类添加处理函数9.3 单文档结构单文档结构图图17添加消息响应成员函熟添加消息响应成员函熟9.3 单文档结构单文档结构l 在显示的消息中选择“WM_CHAR”,如下图。l 按下“Add and Edit”按钮,返回“CMySDIView.CPP”文件的编辑环境,添加如下代码。void CMySDIView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) CMySDIDoc* pDoc = Ge

34、tDocument();/获得文档对象指针ASSERT_VALID(pDoc);/确保pDoc指向当前视图pDoc-m_strText+=nChar;/将键入的数据添加到字符串中Invalidate();/强迫调用OnDraw()函数CView:OnChar(nChar, nRepCnt, nFlags);9.3 单文档结构单文档结构图图18选择选择“击键击键”消息消息9.3 单文档结构单文档结构图图19添加代码添加代码9.3 单文档结构单文档结构l同样方法,添加OnDraw()的代码:lvoid CMySDIView:OnDraw(CDC* pDC)llCMySDIDoc* pDoc = G

35、etDocument();lASSERT_VALID(pDoc);llpDC-TextOut(0,0,pDoc-m_strText); l所谓序列化,实质上就是让对象将其当前的状态(由其成员变量的值表示)写入到永久性存储体永久性存储体中,以后还可以从中读出,重建对象。这种过程称为 “序列化”。 MFC的应用程序架构提供了数据序列化的方式来处理磁盘的存盘与打开,序列化的大部分工作靠应用程序框架来完成,我们所要做的就是重载重载文档类的序列化函数Serialize()。9.3 单文档结构单文档结构四、文档序列化四、文档序列化9.3 单文档结构单文档结构void CMySDIDoc:Serialize

36、(CArchive& ar)if (ar.IsStoring()arm_strText;9.3 单文档结构单文档结构运行程序,输入“同学们好!”,显示结果如下:图图20运行结果运行结果9.4 多文档结构多文档结构q 所谓多文档(MDI),就是解决多个文档的数据管理多个文档的数据管理问题。q MDI应用程序必须有一个CMDIFrameWnd或其派生类的对象,该窗口称作MDI框架窗口。q 多文档程序最初的文档模板只支持主窗口,但每次打开一个新文档时都建立一个新的新的MDI子窗口子窗口,这些窗口中保存保存着各自打开的文档各自打开的文档,而所有的细节都由细节都由MFC库处理库处理。q MDI子窗口是C

37、MDIChildWnd或其派生类对象 。9.4 多文档结构多文档结构 CMyApp:应用程序类 CMainFrame:框架窗口,是MDI应用程序的主窗口 CChildFrame:子框架窗口用于容纳视图 CMyDoc:文档类 CMyView:视图类 CAboutDlg:“关于”对话框AppWizard可为MDI程序框架创建以下类:9.4 多文档结构多文档结构例3. 创建一个多文档的应用程序。 创建创建MDI工程工程MyMDI_1图图21创建创建MDI工程工程9.4 多文档结构多文档结构(1)在向导的第一步中,选择“多重文档”:图图22选择选择“多重文档多重文档”9.4 多文档结构多文档结构(2)

38、其它的选择默认值,最后得到MDI初始工程:图图23MDI工作界面工作界面9.4 多文档结构多文档结构(3)在视图类CMyMDI_1View中添加代码:void CMyMDI_1View:OnDraw(CDC* pDC)CMyMDI_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(20,20,同学们好同学们好,欢迎学习欢迎学习MDI工程工程!); 9.4 多文档结构多文档结构(4)编译,运行程序,结果如下:图图24运行结果运行结果1. 创建步骤创建步骤l 创建一个新的MFC AppWizard(exe)工程,工程名称为MyWor

39、d。l 在AppWizard的第一步中,选择类型为“多重文档”类型。1) 第二步使用缺省的选项,在第三步中主要选择如何支持复合档支持的,我们选择“容器容器”支持,如下图所示,然后按“下一个下一个”按钮。例4. 实现一个基于多文档的丰富文本编辑器,可以在当前文档中插入其 它的图形、音频等。9.4 多文档结构多文档结构图图25选择如何支持复合文档对话框选择如何支持复合文档对话框9.4 多文档结构多文档结构l 在第四步,单击“高级高级”按钮,弹出Advance Options对话框,在“文文件扩展名件扩展名”编辑框中输入doc2,如图所示。完后按“关闭关闭”按钮。9.4 多文档结构多文档结构图图26

40、文件的高级选项对话框图文件的高级选项对话框图 l 第五步使用缺省选项;l 在第六步中,将CMyWordView类的基类设置为CRichEditView后,按Close按钮关闭该对话框;9.4 多文档结构多文档结构图图27选择选择CRichEditViewl 在余下的几步中,全部使用默认值;l 最后单击“完成”按钮,生成应用程序框架。9.4 多文档结构多文档结构图图28MyWord工程工程2. 主要组成类主要组成类应用程序类CMyWordApp是一个从CWinApp类派生的类,充当全部应用程序的容器。应用程序类负责唯一的全局应用程序对象的创建、初始化、运行和退出清理过程。Windows应用程序有

41、一个WinMain()函数,它是整个应用程序的起点。使用VC的应用程序架构创建的MFC程序已经封装封装了该函数。1)当程序被启动时,WinMain()被自动执行,进行一些标准的初始化工作,而把控制权转移给应用程序对象。9.4 多文档结构多文档结构打 开 应 用 程 序 类 的 实 现 文 件 , 在 其 实 例 化 函 数InitInstance()前面有如下的一行代码: CMyWordApp theApp; theApp是应用程序对象,是一个全局变量,先于其它对象被创建。该类有一个很重要的函数InitInstance(),在该函数中创建一个文档模板,来管理文档/视图结构涉及的框架窗口、文档和

42、视图。 9.4 多文档结构多文档结构框架窗口类CMainFrame:是一个从CMDIFrameWnd类派生的类在MDI应用程序中,框架窗口就是应用程序的主窗口,主窗口就是应用程序直接放置于桌面上的哪个窗口,每个应用程序只能有一个主窗口,主窗口的标题栏上常常显示应用程序的名称。子框架窗口类CChildFrame:是一个从CMDIChildWnd类派生的类,在MDI应用程序中,子框架窗口是包含在MDI主窗口的一个子窗口,该子窗口不能有自己的菜单,但可以共享MDI主窗口的菜单。该窗口主要用来容纳视图窗口。9.4 多文档结构多文档结构文档类CMyWordDoc:是从CRichEditDoc类继承而来的

43、类,而CRichEditDoc又是从CDocument继承而来的,它存储应用程序的数据(可以包含音频和视频数据,即可存储丰富文本),并将这些信息提供给应用程序的其余部分。视图类CMyWordView:是从CRichEditView类派生而来的,CRichEditView类提供了丰富的文本编辑功能(可以编辑图形图像数据,即可编辑丰富文本),它是从CView类派生来的。视图窗口与其父窗口框架子窗口的客户区域对齐,它接收用户对应用程序的输入并显示相关联的文档数据。对话框类CAboutDlg:是从CDialog派生来的,该对话框类显示一个简单的版本信息的“关于” 对话框类。9.4 多文档结构多文档结构3. 运行运行MDI应用程序应用程序编译并运行上述程序,建立两个文档MyWord1与MyWord2,其中,在MyWord1中插入一个Excel图表;MyWord2中插入离散数学中的“一阶谓词公式”。显然,这是一个典型的多文档应用程序,同时打开了两个文档。9.4 多文档结构多文档结构图图29 MyWord的运行结果的运行结果9.4 多文档结构多文档结构9.5 多视图多视图很多Windows应用软件,如Word,可以开二个以上窗口。非常方便,也很美观。这就是多视图多视图概

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论