您好,欢迎访问三七文档
Windows程序设计教程文档/视图界面文档/视图结构是在VisualC++中,使用MFC开发基于文档应用程序的基本框架。在这个框架中,数据的维护及其显示是分别由两个不同的、但又彼此紧密相关的对象——文档和视图负责的。本讲将主要围绕这一结构的各个环节展开讨论,理解这一结构的原理和机制对基于文档/视图结构的MFC应用程序开发具有重要作用。基本概念11.1单文档和多文档界面应用程序的实现11.2窗口分割与多视11.311.1基本概念可以把文档看作是数据容器,而视图则可以看作是查看数据的窗口或是和数据发生交互的窗口。本节对MFC中文档/视图结构的概念及其应用作进一步介绍。一般情况下,采用文档/视图结构的应用程序至少应由以下对象组成:应用程序对象(一般为CWinApp派生对象)、框架窗口对象(一般为CFrmeWnd派生对象)、文档对象(一般为CDocument派生对象)、视图对象(一般为CView派生对象)等。除应用程序对象外,其他对象的关系如图11.1所示。文档视图文档当前可视部分框架窗口图11.1文档、视图以及框架的关系一个文档可以对应多个不同视图,而一个视图一般只对应一个文档。当文档数据发生变化时,视图显示的状态也会随之变化;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。当然,并非所有基于窗口的应用都要使用文档/视图结构,以下两种情况不宜采用文档/视图结构:(1)不是面向数据的应用或数据量很少的应用,不宜采用文档/视图结构,如一些工具程序,包括磁盘扫描程序、过程控制程序等;(2)不使用标准的窗口用户界面的程序,如一些游戏等。11.1.2单文档界面(SDI)应用程序图11.2单文档界面程序——NotePad记事本程序11.1.3多文档界面(MDI)应用程序图11.3多文档界面程序——VisualC++6.011.2单文档和多文档界面应用程序的实现11.2.1利用AppWizard创建单文档界面应用程序框架在前面实例中多次使用AppWizard创建单文档界面应用程序框架,其各向导选项采用的是默认设置,本节将详细介绍各向导对话框中选项的含义。1.AppWizard——第1步在【MFCAppWizard-Step1】对话框中(如图11.4所示)可以选择所创建的应用程序类型,这里选择“singledocument”即单文档应用程序。2.AppWizard——第2步在第2步中,决定应用程序是否支持和如何支持数据库,如图11.5所示。图11.4【MFCAppWizard-Step1】对话框图11.5【MFCAppWizard-Step2】对话框3.AppWizard——第3步在第3步中决定应用程序是否支持以及如何支持复合文档,还可以选择是否支持自动化(Automation)和ActiveX控件,如图11.6所示。采用默认的选择:不支持复合文档和自动化,支持ActiveX控件。图11.6【MFCAppWizard-Step3】对话框4.AppWizard——第4步在第4步中选择应用程序界面的特性,如图11.7所示。图11.7【MFCAppWizard-Step4】对话框图11.8【BcumentTemplateStrings】选项卡图11.9【Windowsstyles】选项卡5.AppWizard——第5步第5步决定AppWizard是否为自动生成的代码添加注释,默认选择为自动生成。另外,还决定如何使用MFC库,如图11.10所示。图11.10【MFCAppWizard-Step3】对话框应用程序可以有两种方式使用MFC库:使用MFC动态链接库(AsasharedDLL)和使用MFC静态链接库(Asastaticlinkedlibrary)。默认选择为使用MFC动态链接库。6.AppWizard——第6步在第6步中可以指定AppWizard所生成的类的名称、头文件和实现文件名称和类的基类,如图11.11所示。图11.11【MFCAppWizard-Step4】对话框图11.12程序运行结果11.2.2程序框架中的主要类及相互关系文档/视图结构的应用程序框架中,主要包含5个类:CWinApp类、CFrameWnd类、CView类、CDocument类和CDocTemplate类。(1)CWinApp类为应用程序类,它是应用程序的起点,负责应用程序的启动。(2)CFrameWnd类为框架窗口类,它是应用程序的框架窗口。所谓框架窗口,是指包括菜单、工具栏、状态栏和窗口客户区的整个应用程序的主窗口。(3)CView类为视图类,专门用来对应用程序的数据进行显示。在视图类中有一个很重要的函数OnDraw(),一般在派生类中要重写这一函数。(4)CDocument类为文档类,程序中需要的数据成员,由文档类来进行集中管理。而且文档类将直接与磁盘打交道,把文档类中的数据存盘,或从磁盘中取出存盘的数据。(5)CDocTemplate类为文档模板类,它的作用是耦合文档/视图结构中文档类、视图类和框架窗口类之间的关系,即文档类、视图类和框架窗口类之间的关系是在文档模板类中建立起来的。同时,文档模板类还加载了用户界面所用的资源。在应用程序运行过程中,以上几种类型的对象相互协作来处理命令和消息。唯一的应用程序对象负责管理一个或多个文档模板,每个文档模板创建和管理一个(SDI)或多个(MDI)文档。用户通过包含在框架窗口中的视图来浏览和操作文档中的数据。在SDI应用程序中,以上对象关系如图11.13所示。•图11.13SDI应用程序中各对象的关系应用程序框架中各对象间的关系如下:(1)文档对象存储着与该文档相关联的视图对象的列表以及创建文档时所使用的文档模板的指针;(2)视图是框架窗口的子窗口,它也存储着与其相关联的文档的指针;(3)框架窗口存储着指向当前活动视图的指针;(4)文档模板对象存储着打开文档的列表;(5)应用对象(唯一的全局对象)存储着文档模板的列表。11.2.3文档类、视图类核心函数及作用MFC在CDocument类和CView类中提供了一些相对比较重要的函数,它们负责完成二者之间的通信或者为各自提供独立的服务。CDocument对象负责读入、保存和管理应用程序的数据。文档类允许向其中增加数据成员,其数据可以是任何类型的,如结构体、类或链表等。11.2.4新建、保存和打开的实现在文档/视图结构的应用程序框架中,默认生成了【文件】下拉菜单,其中【新建】、【保存】和【打开】菜单命令项,系统自动生成了菜单命令的响应流程。下面分别简单介绍。1.新建文档执行【文件】|【新建】菜单命令,建立一个新文档。•图11.14新建文档函数OnFileNew()的调用流程新建(ID_FILE_NEW)CWinApp::OnFileNewCDemoDoc::OnNewDocument在此函数中可以给新建立的新文档设置初值CView::OnInitialUpdateCView::OnUpdateCDemoView::OnDraw在该函数中通过调用函数GetDocument获取文档的数据2.保存文档保存文档的实现是在序列化函数Serialize()中实现的。3.打开文档当执行【文件】|【打开】菜单命令时,就开始执行打开文件操作。保存(ID_FILE_SAVE)CDocument::OnFileSaveCDocument::OnSaveDocumentCDemoDoc::Serialize(CArchive&ar)如果ar.IsStoring()为真,执行存盘弹出文件保存对话框,设置文件名和路径。关闭对话框后,产生一个CArchive对象ar图11.15保存文档函数的执行流程打开(ID_FILE_OPEN)CWinApp::OnFileOpenCDocument::OnOpenDocumentCDemoDoc::Serialize(CArchive&ar)CView::OnInitialUpdateCDemoView::OnDraw在该函数中通过调用函数GetDocument获取文档的数据,进行数据显示弹出打开文件对话框,选择要打开的文件后,关闭对话框,产生一个CArchive对象arCView::OnUpdate图11.16打开文档函数的执行流程11.2.5多文档界面应用程序框架多文档界面应用程序简称MDI(MultipleDocumentInterface),它允许有多个文档类、视图类和多个文档模板(CmultiDocTemplate)存在,即可以建立多种文档—视图—子框架窗口的关系。运行时允许打开多个MDI子框架窗口,拥有各自的文档和视图对象。在打开的多个子窗口中,只有一个活动窗口,应用程序菜单和工具栏的所有命令都是针对活动窗口的。图11.17多文档应用程序窗口多文档界面应用程序的应用程序类、主框架、子框架、文档模板、文档、视图之间的结构关系,可表示为如图11.18所示。应用程序类CMDocDemoApp文档类1子框架视图类1文档模板1文档类2文档模板2主框架资源1资源2其他文档模板子框架视图类2图11.18多文档应用程序框架结构11.3窗口分割与多视分割窗口将窗口分成几个部分,每个部分通常代表一个视图(也可以是具有子窗口标识的CWnd对象),又称窗格,如图11.19所示。图11.19分割窗口如果想在一个窗口里面观察文档的不同部分,或者是在一个窗口里用不同类型的视图(比如用图表和表格)观察同一个文档,那么采用分割窗口是非常方便的。许多优秀的软件都采用了分割窗口技术,因此有必要掌握分割窗口的用法。11.3.1窗口分割基础知识1.动态分割2.静态分割图11.20静态分割窗口(图标编辑器)11.3.2Create——创建分割窗口该函数用来动态创建分割窗口,同时将该窗口与类CSplitterWnd相关联,其声明如下:BOOLCreate(CWnd*pParentWnd,intnMaxRows,intnMaxCols,SIZEsizeMin,CCreateContext*pContext,DWORDdwStyle=WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|SPLS_DYNAMIC_SPLIT,UINTnID=AFX_IDW_PANE_FIRST);11.3.3CreateStatic——创建静态分割窗口该函数用来创建静态分割窗口,同时,将该窗口与类CSplitterWnd相关联,其声明如下:BOOLCreateStatic(CWnd*pParentWnd,intnRows,intnCols,DWORDdwStyle=WS_CHILD|WS_VISIBLE,UINTnID=AFX_IDW_PANE_FIRST);11.3.4CreateView——创建窗格该函数为静态分割窗口创建窗格。在框架显示分割的窗口之前,静态分割窗口的所有窗格都必须创建完毕。不过,当动态分割窗口的用户分割窗格、行或者列时,框架也会调用这个成员函数。它的声明如下:virtualBOOLCreateView(introw,intcol,CRuntimeClass*pViewClass,SIZEsizeInit,CCreateContext*pContext);11.3.5SetRowInfo和SetColumnInfo——设置窗格信息这两个成员函数主要用于为窗格行(列)设置新的最小高(宽)和理想高(宽)。行(列)的最小值决定了行(列)何时充分显示窗口或者隐藏窗口。当框架显示分割窗口时,它将在分割窗口的客户区内,按照从左上角到右下角的顺序,根据窗格的理想尺寸对它们进行布局。11.3.6OnDrawSplitter——绘制分割窗口特征此函数由框架负责调用,主要用来绘制分割窗口,或者指定分割窗口的确切特征。它的声明如下:virtualvoidOnDrawSplitter(CDC*pDC,ESplitTypenType,constCRect&rect);1
本文标题:1-文档视图界面.
链接地址:https://www.777doc.com/doc-3054810 .html