您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 新11章单文档与多文档.
信息科学与工程学院李忠哗文档视图结构概述文档视图结构的5个类文档串行化操作设置窗口样式SDI编程实例MDI简介多文档编程实例类的序列化本章内容信息科学与工程学院李忠哗数据处理是一般软件都要完成的一项主要工作。采用传统的编程方法,数据处理是一项复杂的任务。为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念。11.1.1文档/视图结构信息科学与工程学院李忠哗数据处理分为数据的管理和显示文档用于管理和维护数据视图用来显示和编辑数据MFC通过其文档类和视图类提供了大量有关数据处理的方法。11.1.1文档/视图结构信息科学与工程学院李忠哗一般说来,文档是MFC应用程序中所处理数据的集合,包括文本、图形、图像和表格数据。一个文档代表了用户存储或打开的一个文件单位。文档的主要作用是把对数据的处理从对用户界面的处理中分离出来,集中处理数据,同时提供了一个与其它类交互的接口。什么是文档?信息科学与工程学院李忠哗视图是文档在屏幕上的一个映像,它就像一个观景器,用户通过视图看到文档,也是通过视图来改变文档,视图充当了文档与用户之间的媒介物。应用程序通过视图向用户显示文档中的数据,并把用户的输入解释为对文档的操作。一个视图总是与一个文档对象相关联,用户通过与文档相关联的视图与文档进行交互。当用户打开一个文档时,应用程序就会创建一个与之相关联的视图。什么是视图?信息科学与工程学院李忠哗视图负责显示和编辑文档数据,但不负责存储。用户对数据的编辑需要依靠窗口上的鼠标与键盘操作才得以完成,这些消息都是由视图类接收后进行处理或通知文档类,如收到窗口刷新消息时调用视图类的成员函数OnDraw()显示文档内容。视图还可在打印机上输出。文档负责数据的读写操作,数据通常被保存在文档类的成员变量中,文档类通过一个称为串行化的成员函数将成员变量的数据保存到磁盘文件中。MFC应用程序为数据的串行化提供了默认支持。视图和文档的功能信息科学与工程学院李忠哗视图是文档在屏幕上的一个映像,它就像一个观景器信息科学与工程学院李忠哗文档、视图、框架窗口之间的关系一个视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档对外显示的窗口,但它并不能完全独立,它必须依存在一个框架窗口内。一个视图只能拥有一个文档,但一个文档可以同时拥有多个视图。信息科学与工程学院李忠哗文档/视图结构的优点把数据处理类从用户界面处理类中分离出来,使得每一个类都能集中地执行一项工作。把Windows程序通常要做的工作分成若干定义好的类,这样有助于应用程序的模块化,程序也易于扩展,编程时只需修改所涉及的类。虽然文档/视图结构牵涉到许多类,其中的关系比较复杂,但MFCAppWizard向导建立的MFC应用程序框架已经把程序的主要结构完成了,模块间的消息传递以及各函数的功能都已确定。MFC应用程序框架起到了穿针引线的作用,按照消息处理函数功能的不同,将不同消息的响应分别分布在文档类和视图类中。信息科学与工程学院李忠哗程序员的一般工作在文档类中加入数据成员建立自己的菜单并添加命令处理函数在视图类中编写成员函数用于实现文档的显示和修改信息科学与工程学院李忠哗一个单文档的应用程序的执行过程分为以下5步:(1)定义全局对象theApp,这是应用程序对象。语句为:CMySdiApptheApp;(在XX.cpp文件中)(2)程序的入口函数WinMain()得到控制。(3)在WinMain()函数执行过程中,调用CMySdiApp类的InitInstance()成员函数。在该函数中,系统首先创建一个单文档模板类,该类主要用来将程序中的文档类、视图类、窗口框架类联系在一起进行管理。(4)在WinMain()函数执行过程中,调用CMySdiApp类的Run()成员函数,进入消息循环,根据消息的类别发送到适当的对象中,查消息映射表,激活并运行对象中的消息处理函数。(5)WinMain()函数执行完毕,程序终止并退出。11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗1.InitInstance()函数InitInstance()函数是程序每次开始时进行初始化工作的地方,该函数的作用是初始化应用程序,它的返回值决定了框架结构接下来要执行的内容。如果初始化正常,InitInstance()函数返回TRUE,程序可以继续运行,如果从InitInstance()函数返回FALSE将关闭应用程序。11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗在SDI应用程序框架中,InitInstance()函数在MySdi.cpp中,程序源代码如下:BOOLCMySdiApp::InitInstance(){。。。CSingleDocTemplate*pDocTemplate;//注册应用程序文档模板pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMySdiDoc),RUNTIME_CLASS(CMainFrame),//SDI主框架窗口RUNTIME_CLASS(CMySdiView));AddDocTemplate(pDocTemplate);。。。}11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗从上面的程序中可以看到:(1)系统首先创建了一个单文档模板类(CSingleDocTemplate)的对象,并用指针pDocTemplate指向该对象(2)IDR_MAINFRAME为资源ID号。(3)RUNTIME_CLASS(CMySdiDoc),生成一个文档类对象,返回一个指针指向该对象(4)文档、视图、框架类和所涉及的资源形成了一种固定的联系,这种固定的联系就称为文档模板。文档模板类对象由资源ID号、指向文档类对象的指针、指向视图类对象的指针和指向框架窗口类对象的指针构成。(5)文档模板类主要用来将程序中的文档类、视图类和框架窗口类联系在一起进行管理。程序运行时可以看到视图类对象以及框架窗口类对象。11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗2.CMySdiApp类的Run()函数Run()函数负责维护消息循环。简单的消息循环是while循环,程序如下:while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}系统为每个窗口的线程生成一个消息队列,从这个队列中取出消息并进行处理是由应用程序来完成的,应用程序取出并且处理消息是一个循环往复的过程,执行的代码就是上面的while循环。在这个while循环中,首先调用GetMessage()函数从消息队列中取出一条消息并放在MSG类型的变量msg中。11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗如果GetMessage()函数在消息队列中检索到一个WM_QUIT消息,则返回FALSE,这样便跳出循环了。如果消息队列为空,GetMessage()函数并不返回,而是将控制权交给其它进程。接下来调用TranslateMessage()函数对取出的消息进行翻译,TranslateMessage()函数根据初始键盘消息(如:WM_KEYDOWN、WM_KEYUP等)提供的信息,将初始键盘消息翻译成字符消息(如WM_CHAR),被翻译后的消息放在线程的消息队列中,由GetMessage()函数将其取出。最后通过调用DispatchMessage()函数将这个消息发送出去,传递给窗口类的OnWndMsg(),该函数把收到的消息分为三大类(窗口消息、命令消息和控件消息),并做相应处理。11.1.2SDI程序的创建过程及相关函数信息科学与工程学院李忠哗当用户选择了菜单项,单击了快捷键或工具条按钮,系统就会发送WM_COMMAND消息。MFC的命令消息传递机制比较复杂,是按照特定的顺序从一个对象传到另一个对象,直到该消息被某个消息处理函数处理,命令消息传递过程如下:(1)发送给活动的视图;(2)发送给该视图相对应的文档和文档模板对象;(3)传送到框架窗口;(4)传送到应用程序对象;只要在传递过程中有一个对象接受并处理了此消息,那么后面的对象都将接受不到该消息。如果上述对象都没有处理该消息,则调用DefWindowProc()函数进行默认的处理。11.1.3SDI程序的命令消息传递过程信息科学与工程学院李忠哗单文档的文档/视图结构核心类有5个:CWinApp、CDocument、CView、CDocTemplate和CFrameWnd。CDocument类提供了文档所需要的最基本的功能实现,主要的功能有打开文档、保存文档等操作。CView类是从CWnd类下派生的,所以视图类都具有CWnd的所有功能,如:创建、移动、显示和隐藏窗口等。文档、视图、框架类和所涉及的资源形成了一种固定的联系,这种固定的联系就称为文档模板。文档模板类在应用程序中有着非常重要的作用,是它将原本独立的文档、视图和框架窗口对象联系在一起。11.2文档/视图结构的5个类信息科学与工程学院李忠哗CFrameWnd类在Doc/View结构中起着举足轻重的作用。具体来说,框架窗口维护了很多幕后的工作,例如工具条、菜单、状态条的显示和更新,视图的位置和显示,其它可停靠空间的停靠和动态尺寸调整。在单文档应用程序中,使用的是CFrameWnd,在多文档应用程序中,使用的是CMDIFramcWnd和CMDIChildWnd,这两个类都是CFrameWnd类的子类。文档/视图结构的几个基本类的成员中间经常需要互相访问,MFC提供的一些互相定位访问的方法,如表11-1所示。11.2文档/视图结构的5个类信息科学与工程学院李忠哗表11-1MFC提供的一些互相定位访问的方法当前位置被访问的位置访问方法文档视图GetFirstViewPositionGetNextView文档模板GetDocTemplate视图文档GetDocument视图框架GetParentFrame框架视图GetActiveView框架文档GetActiveDocumentMDI主框架MDI子框架MDIGetActiveMDI子框架MDI主框架GetParentFrame任何位置应用程序AfxGetApp任何位置主框架AfxGetMainWnd信息科学与工程学院李忠哗视图类的成员函数GetDocument()一个视图对象只有一个与之相关联的文档对象。在MFC应用程序中,视图对象通过调用成员函数函数GetDocument()得到当前文档。GetDocument()是视图类的成员函数,调用它可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有成员。当利用MFCAppWizard向导创建一个SDI单文档应用程序Mysdi时,生成了视图类的一个派生类,并在派生类中定义了函数GetDocument()。文档类常用的成员函数信息科学与工程学院李忠哗当一个文档的数据通过某个视图被修改后,与它关联的每一个视图都必须反映出这些修改。因此,视图在需要时必须进行重绘,即当文档数据发生改变时,必须通知到所有相关联的视图对象,以便更新所显示的数据。更新与该文档有关的所有视图的方法是调用成员函数CDocument::UpdateAllViews()。文档类常用的成员函数信息科学与工程学院李忠哗信息科学与工程学院李忠哗串行化:将对象写入字节流和从字节流恢复对象的操作。串行化除了可以使用文件保存对象之外,还可以通过网络、串口传输对象,因此使用字节流。无论是保存文档或是打开文档,应用程序都是通过调用文档类的Serialize()串行化成员函数来完成操作的。因此,在大多数情况下,都需要重载Serialize()成员函数。11.3文档串行化操作信息科学与工程学院李忠哗串行化代码如下:voidCMyMdiDoc::Serialize(CArchive&ar){if(ar.IsStoring())
本文标题:新11章单文档与多文档.
链接地址:https://www.777doc.com/doc-2353061 .html