VisualC++程序设计教程-第七章框架窗口和视图ppt课件_第1页
VisualC++程序设计教程-第七章框架窗口和视图ppt课件_第2页
VisualC++程序设计教程-第七章框架窗口和视图ppt课件_第3页
VisualC++程序设计教程-第七章框架窗口和视图ppt课件_第4页
VisualC++程序设计教程-第七章框架窗口和视图ppt课件_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、第第7章章 框架窗口、文档和视图框架窗口、文档和视图7.1 运用程序组成构造运用程序组成构造1单文档运用程序Single Document Interface,SDI 在单文档界面程序中,用户在同一时辰只能操作一个文档,如记事本程序。在这些运用程序中,翻开文档时会自动封锁当前翻开的活动文档,假设文档修正后尚未保管,会提示能否保管所做的修正。由于一次只开一个窗口,因此不像WORD那样需求一个窗口菜单。单文档运用程序普通都提供一个“文件菜单,在该菜单下有一组命令,用于新建文档、翻开已有文档、保管或另存为等。这类程序相对比较简单,常见的运用程序有终端仿真程序和一些工具程序。n2多文档运用程序Mult

2、iple Document Interface,MDIn 在多文档界面运用程序中,允许同时操作多个文档,如Microsoft Word。可以翻开多个文件同时也就为每个文件翻开一个窗口,可以经过切换活动窗口激活相应的文档进展编辑。多文档运用程序也提供一个“文件菜单,用于新建、翻开、保管文档。与单文档运用程序不同的是,它往往还提供一个“封锁菜单项,用于封锁当前翻开的文档。多文档运用程序还提供一个“窗口菜单,管理一切翻开的子窗口,包括对子窗口的新建、封锁、层叠、平铺等。封锁一个窗口时,窗口内的文档也被自动封锁。n3基于对话框的运用程序Dialog based Application)n 基于对话框的

3、运用程序非常简单,由运用程序类、对话框类可以作为其它控件的容器构成。它的生命周期可概括为:经过运用程序类的InitInstance()函数,构造一个方式对话框对象;调用DoModal函数,让基于对话框的运用程序像对待普通对话框一样接纳和分配音讯;用户退出对话框后,程序也就随之终了。常见的基于对话框的运用程序有计算器等以对话框为容器规划的程序。7.1.1 CMainFrame类和窗口nMFC运用程序主要由3部分组成:窗口、文档和视图。其中窗口是整个运用程序的载体,也是运用程序不可短少的部分。n窗口也叫框架窗口,它可以分为两类:一类是主框架窗口也叫主窗口,另一类是子框架窗口也叫子窗口。在MFC运用

4、程序中,框架Framework是运用程序所应具备的软件模块按一定的构造组成的集合。框架窗口可以了解为框架的可视化显示方式。n主框架窗口是运用程序放置在桌面DeskTop上的那个窗口,每个运用程序只能有一个主窗口,主窗口的标题栏上通常显示运用程序的称号。子框架窗口是运用程序主框架窗口内的子窗口,它占据了主框架窗口客户区的部分或全部。视图是子框架窗口内的子窗口,它占据了子框架窗口客户区的部分或全部。n图7-1标明了多文档运用程序中主框架窗口、子框架窗口和视图之间的关系。由于单文档运用程序没有子框架窗口,所以可以以为视图充溢了整个主框架窗口。n运用MFC AppWizard创建单文档运用程序后,包含

5、主框架窗口类的文件分别为MainFrm.h和MainFrm.cpp。主框架窗口类是由CFrameWnd派生而来的,类名为CMainFrame。而对于多文档运用程序,主框架窗口由CMDIFrameWnd派生。nCMainFrame类有4个重要的函数:AssertValid、Dump、OnCreate和PreCreateWindow。这4个函数都是由运用程序导游自动声明和定义的,无须人为干涉,不过了解它们的作用还是非常有必要的,在需求的情况下,用户还可以修正它们以到达预定效果。它们各自的功能如下:n1AssertValid 函数用来诊断CMainFrame对象的有效性。n2Dump 函数用来输出C

6、MainFrame对象的形状信息。n3OnCreate 函数用来创建工具栏m_wndToolBar和形状栏m_wndStatusBar,而在视图窗口中是由基类CFrameWnd的成员函数OnCreate经过调用OnCreateClient函数创建的。n4PreCreateWindow 函数是一个虚函数。假设要创建一个非默许风格的窗口,可以重载这个函数,在函数中经过修正Createstruct构造参数来改动窗口类、窗口风格、窗口大小和位置等。7.1.2 CDocument类和文档nCDocument类是CCmdTarget类的派生类,其派生关系如图74所示。CDocument类为用户定义的文档类

7、提供了根本的函数功能,它支持规范操作,如创建、装载、保管等。一个运用程序可以支持多种类型的文档,每种类型的文档都经过一个文档模板对象建立与各自视图的联络。n不论是SDI运用程序还是MDI运用程序,文档类都是从CDocument类派生出来的。在文档/视图构造中,文档类的主要义务通常是对数据进展管理和维护,数据将保管在文档类的成员变量中,视图经过对这些变量的访问来获取或前往数据,并能经过这种方式来更新并显示数据。n从CDocument类派生文档类的步骤如下:n1为每一个文档类型从 CDocument类当然也可以是其他 CDocument类的派生类派生一个相应的文档类。n2为文档类添加成员变量。这些

8、成员变量用来保管文档的数据,其他对象如与文档相关联的视图直接或间接地访问这些成员变量以读取或更新文档的数据。n3重载Serialize成员函数,实现文档数据的序列化。7.1.3 CView类和视图nCView类是CWnd类的派生类,其派生关系如图7-5所示。CView类是MFC中一个根本的类,也是其他MFC视图类和用户视图派生类的基类。n视图窗口用来显示文档中的数据,并根据视图对象提供的根本功能,指定用户运用什么方式查看文档数据,接受用户对数据的交互操作包括选择和编辑,并将更改后的数据回传给文档。视图被附加到文档中并在文档和用户之间充任媒介,它可以在屏幕上呈现文档的数据,并将用户输入解释为对文

9、档的操作,还可以为打印和打印预览呈现图像。n在MFC类库的层次位置中,CView类是从CWnd类下派生的,掌握这个承继关系对用户来说是很有用的。例如,由于一切的从CView类派生的类也都是由CWnd类间接派生的,因此这些类具有CWnd的一切功能,如创建、挪动、显示和隐藏窗口等,并且CView类可以接纳任何Windows音讯。nCView类只提供了根底框架,在MFC中派生了CView类的许多子类,为不同的运用提供了强大支持。这些视图类都不是直接派生于CView类,而是派生于CView的子类CCtrlView。CCtrlView类的派生类对应于Windows通用控件,提供了与通用控件相对应的功能。

10、下面简单地引见一下视图类各派生类的情况。n1.CEditView 类nCEditView类主要用来支持类似编辑控件所要实现的功能,常见的文本操作根本上都是由该类支持实现的。n假设希望有一个具有简单编辑功能或附加功能的编辑窗口,就可以构造一个CEditView类型的对象。一个CEditView对象可以占有一个窗体的整个用户区。用户也可以经过从CEditView中派生本人的类来添加或改动根本功能,并可以声明能参与到文档模板中的类。n2.CTreeView 类nCTreeView类主要提供对一些树形控件所实现的功能的支持。它可以使数据的显示方式更富于变化。n3.CListView 类nCListVi

11、ew类与CTreeView类类似,不同之处在于它提供了一种简捷地实现数据的不同显示方式的途径,为数据组织提供了多种手段。n4.CRichEditView 类nCRichEditView类主要提供对Rich文本操作的支持。Rich文本是既可以为文本,也可以为图形图像的一种特殊格式的文本。n5.CScrollView 类nCScrollView类的主要功能是提供视图的滚动显示。需求留意的是,以上引见的几个类都是间接派生于CView类,而该类直接承继至CView类,这就决议了其动作的特殊性。7.1.4 框架窗口、文档和视图的关系n文档/视图构造是MFC运用程序中最根本的程序构造,它适用于大多数Win

12、dows运用程序。文档与视图完成了程序的大部分功能,它们是MFC运用程序的中心。n由MFC创建的运用程序的主线程序表达在运用类中,而运用类经过文档模板类将文档类、窗口类SDI中的主窗口类或MDI中的子窗口类、视图类联络在一同,组成一个有机整体,共同完成程序设计义务。单文档模板类CSingleDocTemplate和多文档模板类CMutiDocTemplate均由CDocTemplate类派生。单文档模板类支持单文档运用程序,多文档模板类支持多文档运用程序。n运用类CWinApp经过一个内部类CDocManager来管理文档模板类。CWinApp类成员变量m_pDocManager是指向CDoc

13、Manager类对象的指针。在CDocManager类中定义的指针链表,其每项都是一个指向文档模板对象的指针。实践上,运用类经过其链表成员管理运用程序的一切文档模板对象。n文档对象用来保管和管理数据,视图对象用于数据交互,运用程序框架用来管理不同文档显示界面。例如,程序设计要求用数据网格显示二维数据,同时还要求用图形显示二维数据,即这些数据来自同一文档,但以不同的视图方式显示。在这种情况下可以用框架中的文档模板把一个文档及两个视图组合在一同。n在程序运转时,CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后由文档模板创建文档实例和视图实例,并将两者关联起来。

14、普通来讲,用户只需对文档和视图进展操作,框架的各种行为曾经被MFC安排好而不需求人为干涉,这也是MFC设计文档/视图构造的本意,让用户将留意力放在完成义务上,而从界面编写中解放出来。文档/视图构造的数据交互如图7-6所示,两者的关系如图7-7所示。图7-6 文档-视图构造的数据交互图7-7 文档与视图的关系 n框架窗口、文档和视图之间的关系可以表述为:文档和视图之间是一对多的关系,每个视图和框架窗口是一对一的关系。n框架窗口、文档和视图三者之间是相互关联、相互协调的,彼此都包含了指向对方的指针。它们之间的联络是经过文档模板的构造函数来实现的。下面引见在程序中如何得到各种对象的指针。n1全局函数

15、AfxGetApp()可以得到CWinApp运用程序类指针,而AfxGetApp()-m_pMainWnd就是框架窗口CFrameWnd的指针。n2在框架窗口中,CFrameWnd:GetActiveDocument()得到当前活动文档指针。n3在框架窗口中,CFrameWnd:GetActiveView()得到当前活动视图指针。n4在视图中,CView:GetDocument()用于检索指向文档类的指针。n5在文档中,CDocument:GetFirstViewPosition()和CDocument:GetNextView()用来遍历一切和文档关联的视图。n6在文档中,CDocument:

16、GetDocTemplate()用来得到文档模板指针。n7在多文档界面中,CMDIFrameWnd:MDIGetActive()得到当前活动的MDI子窗口。7.2 文档n文档Document是MFC运用程序中所处置数据的集合,包括文本、图形、图像和表格等类型。一个文档对应于用户当前翻开的一个文件。文档的主要作用是把数据处置从用户界面的管理中分别出来,集中处置数据,同时提供与视图交互的接口。7.2.1 数据成员n数据成员包括成员变量和成员函数。CDocument类为用户定义的文档类提供了根本的函数功能。nCDocument支持规范操作,如创建、装载、保管等。框架用CDocument定义的界面来操

17、作文档。CDocument类的主要成员变量如下:nCString m_strTitle:用于标志文档的标题。nCString m_strPathName:用于标志文档的途径。nCDocTemplate *m_pDocTemplate:指向文档模板的指针。nCPtrList m_viewList:视图列表。nBOOL m_bModified:指明翻开文档后能否进展了修正。nBOOL m_bAutoDelete:在没有可用视图时能否删除自动文档。nBOOL m_bEmbedded:能否可经过OLE创建文档。7.2.2 成员函数n1.AddView函数n函数原型如下:nvoid AddView(CV

18、iew *pView);n阐明:为当前的文档添加一个视图。其中,参数pView 是指向新添加的视图的指针。n2.CanCloseFrame函数n函数原型如下:nvirtual BOOL CanCloseFrame(CFrameWnd *pFrame);n阐明:运用程序调用该函数判别能否可以封锁pFrame指向的窗口。假设能封锁,那么前往非零值,否那么,前往FALSE。在默许情况下,该函数先测试这个窗口能否是文档的独一窗口。假设是,那么提示用户存盘。n3.DeleteContents函数n函数原型如下:n virtual void DeleteContents();n阐明:框架窗口调用该函数在不

19、删除CDocument对象的前提下删除文档中的数据。当文档被反复运用时,调用该函数确保文档为空。n4.GetDocTemplate函数n函数原型如下:n CDocTemplate *GetDocTemplate() const;n阐明:调用该项函数得到一个指向当前文档运用的文档模板的指针。当文档不是由文档模板来管理时,前往NULL。n5.GetFile函数n函数原型如下:nvirtual CFile*GetFile(LPCTSTR lpszFIleName,UINT nOpenFlags,CFileException*pError);n阐明:得到一个CFile对象的指针。其中,lpszFile

20、Name 为指定文件的途径的字符串,nOpenFlags为翻开文件时指定文件的共享和存取方式,pError为指向错误代码的指针。n6.GetFirstViewPosition函数n函数原型如下:nvirtual POSITION GetFirstViewPosition() const;n阐明:利用该函数可得到与文档相关的第一个视图的位置,前往值可以供GetNextView()函数运用。n7.GetNextView函数n函数原型如下:nvirtual CView *GetNextView(POSITION &rPosition) const;n阐明:得到下一个视图的位置。假设当前视图是

21、视图系列中最后一幅时,前往NULL。其中,参数rPosition是前一幅视图的位置。n8.GetPathName函数n函数原型如下:nconst CString &GetPathName() const;n阐明:前往当前文档存盘文件的完好途径。n9.GetTitle函数n函数原型如下:nconst CString &GetTitle() const;n阐明:前往文档的标题,通常与文档的文件名有关。n与其相对的是SetTitle()函数,它用于设置文档的标题。其原型如下:nvirtual void SetTitle(LPCTSTR lpszTitle);n10.IsModifie

22、d函数n函数原型如下:nBOOL IsModified();n阐明:检测文档能否被修正正。假设文档被修正正,前往TRUE。n11.OnChangedViewList函数n函数原型如下:nvirtual void OnChangedViewList();n阐明:在文档的视图添加或减少时调用。默许是当文档的最后一个视图被删除时自动删除文档。n12.OnCloseDocument函数n函数原型如下:nvirtual void OnCloseDocument();n阐明:封锁文档时被调用。默许先调用DeleteContents()函数删除文档数据,然后再封锁视图窗口。n13.OnNewDocument

23、函数n函数原型如下:nBOOL OnNewDocument();n阐明:在SDI运用程序中,当用户在“文件菜单中单击“新建菜单项时,自动调用框架窗口。OnNewDocument消除旧文档内容,得到一个“空的文档。而在MDI运用程序中,框架自动生成一个新的文档对象,假设要调用OnNewDocument()实现初始化,用户可以在此处插入一个新文档的初始化代码。n14.OnOpenDocument函数n函数原型如下:nvirtual BOOL OnOpenDocument(LPCTSTR lpszPathName);n阐明:在翻开文档的时候调用。其中,lpszPathName 为被翻开文档的途径。n

24、15.OnSaveOpenDocument函数n函数原型如下:nvirtual BOOL OnSaveDocument(LPCTSTR lpszPathName);n阐明:当执行“保管和“另存为命令时被调用。默许时,调用CObject:Serialize函数将文档数据存入文件。假设操作胜利,前往TRUE。n16.SaveModified函数n函数原型如下:nvirtual BOOL SaveModified();n阐明:当封锁一个被修正的文档时,调用该函数讯问能否需求保管修正的文档。假设胜利地封锁了文档,那么前往TRUE。n17.SetModifiedFlag函数n函数原型如下:nvoid S

25、etModifiedFlag(BOOL bModified=TRUE);n阐明:设置文档的编辑标志。当用户保管文档后,文档的bModified自动被设置为FALSE。假设用户退出程序时,bModified的标志为TRUE,系统会自动提示用户能否保管文档。当用户在程序中某处修正了文档数据,在其后加上代码pDoc-SetModifiedFlag(TRUE)可以有效地保证数据的平安。n18.Serialize函数n函数原型如下:nvoid Serialize(CArchive &ar);n阐明:当用户要把文档中的内容写入文件或从文件中调出来时,框架自动调用文档的Serialize成员函数来实

26、现文档和文件的序列化。要留意的是,读出数据的顺序应该和写入数据的顺序坚持一致。n19.UpdateAllViews函数n函数原型如下:nvoid UpdateAllViews(CView *pSender,LPARAM lHint=0L,CObject *pHint=NULL);n阐明:保证数据在文档类及其视图类中是一致的。视图类接受用户的输入,那么会将界面数据存储到文档数据中,而文档类中的数据发生了变化,也应该及时更新视图类数据,并刷新界面。7.2.3 文档序列化n文档类中存储数据的方法有多种,例如,运用对象指针、动态对象数组、动态链式存储构造或哈希表来实现用户自定义数据的存储。文档类经过“

27、序列化机制来管理文档中数据的存取,序列化机制表示图如图7-8所示。如图7-8 序列化机制n耐久性persistence是指对象所具有的保管和加载其形状的才干,即对象可以在程序运转终了前将对象的当前形状写入永久性存储体中,以后在程序再运转时经过数据的读取而恢复对象的形状。这种对象的保管和恢复的过程称为序列化serialize。n为了深化了解序列化操作,有必要了解对文档不同操作后的详细程序运转过程。n1.创建空文档n运用程序类的InitInstance()函数在调用了AddDocTemplate()函数之后,会经过CWinApp:ProcessShellCommand间接调用CWinApp的成员函

28、数OnFileNew,并依次完成以下任务:n1构造文档对象,从磁盘中读取数据。n2构造主框架类CMainFrame类的对象,并创建该主框架窗口,但不显示。n3构造视图对象,并创建视图窗口,同样也不显示。n4经过MFC内部机制,建立主框架窗口、文档和视图对象之间的联络。n5调用CDocument:OnNewDocument()虚函数,并调用CDocument:DeleteContents()虚函数来去除文档对象的内容。n6调用CView:OnInitialUpdate()虚函数初始化视图类的数据成员。n7调用CFrameWnd:ActiveFrame()虚函数,显示带有菜单、工具栏、形状栏以及视

29、图窗口的主框架窗口。n2.翻开文档n在利用MFC运用程序导游创建运用程序时,MFC会自动将“文件菜单中的“翻开命令映射到CWinApp类的OnFileOpen()成员函数。OnFileOpen()函数会完成以下操作:n1弹出通用文件“翻开对话框,供用户选择一个文档。n2文档指定后,调用文档对象的CDoucment:OnOpenDocument()虚函数。这个函数将翻开文档,并调用DeleteContents()函数去除文档对象的内容,然后创建一个CArchive对象用于数据的读取,接着又自动调用Serialize()函数。n3调用视图对象的CView:OnInitialUpdate()虚函数初

30、始化视图类的数据成员。n3.保管文档n在利用MFC运用程序导游创建运用程序时,它会自动将“文件菜单中的“保管命令与文档类的OnFileSave成员函数在内部关联。OnFileSave()函数会完成以下操作:n1弹出通用文件“保管对话框,让用户输入一个文件名。n2调用文档类对象的CDocument:OnSaveDocument()虚函数,接着又自动调用Serialize()函数,将CArchive对象的内容保管在文档中。n4.封锁文档n当用户试图封锁文档或退出运用程序时,运用程序会根据用户对文档的修正与否来进一步完成以下义务。n1假设文档内容已修正,那么弹出一个“音讯对话框,讯问用户能否保管修正

31、后的文档。当用户选择“是,那么运用程序执行OnFileSave过程。n2调用CDocument:OnCloseDocument()虚函数,封锁一切与该文档相关联的文档窗口及相应的视图,调用文档类的DeleteContents去除文档数据。n用户经常需求本人定义类来实现序列化操作,以完成某些特定的功能,MFC为满足用户的这个需求规定了自定义类实现序列化必需满足以下4个条件:n1类必需是直接或间接地从CObject类派生。n2类必需定义一个不带参数的构造函数。当从磁盘载入文档时调用该构造函数来创建一个可序列化的对象,运用从文件中读出来的数据填充对象的成员变量。n3要运用MFC序列化宏。在类的头文件

32、中运用DECLARE_SERIAL宏,在类的实现文件中运用IMPLEMENT_SERIAL宏。n4自定义类必需重载序列化成员函数Serialize()。由于不同类的数据构造各不一样,可序列化的类应该重载Serialize()函数,使其支持对特定数据的序列化。并且,任何需求序列化的对象都应该在文档派生类中作为数据成员进展声明。7.3 视图n视图view是文档在运用程序窗口中的一个映像。视图就像一个观景器,用户经过视图查看和修正文档,视图充任了文档与用户之间的媒介物。运用程序经过视图向用户显示文档中的数据,并把用户的输入解释为对文档的操作。一个视图总是与一个文档对象相关联,用户经过与文档相关联的视

33、图与文档进展交互。当用户翻开一个文档时,运用程序就会创建一个与之相关联的视图。7.3.1 视图的特点n视图主要有以下几方面特点:n1多个视图可以共享一个主窗口。n2CDocTemplate为视图、主窗口和文档之间建立相互联络。n3当用户翻开或切分窗口时,运用程序将构造一个视图,并将它衔接到相应的文档。n4一个视图只能拥有一个文档,而一个文档可以拥有多个视图。n5视图接纳由程序框架传给它的命令,假设视图不能处置该命令,就将其传送给相关联的文档处置。n6视图可处置多种类型的输入和命令,如键盘输入、鼠标输入、菜单命令、工具栏命令等。n7视图担任显示和修正文档数据。在运用程序中可以运用视图直接读取文档

34、的数据,也可以在文档中提供由视图调用的函数来获取文档数据。7.3.2 视图的成员函数n1.OnDraw函数n函数原型如下:nvoid OnDraw(CDC*pDC);n其中,pDC为指向打印设备描画表的指针。n阐明:当用户执行屏幕显示、打印和打印预览时,框架将调用该函数在输出设备上显示文档数据,因此OnDraw函数是编程时需求覆盖的函数之一。n2.GetDocument函数n函数原型如下:nCDocument *GetDocument() const;nCDocument 派生类 *GetDocument() const;n阐明:获得与视图类相关连的文档对象指针。在视图类中可用GetDocum

35、ent获取与之关联的文档对象的指针,获得对文档数据、对象、对象集合的访问。经过该函数还可以获得指向视图对象所属的文档的文档指针m_pDocument。n3.OnUpdate 函数n函数原型如下:nvirtual void OnUpdate(CView *pSender,LPARAM lHint, CObject *pHint);n其中,参数“pSender表示与被更改的文档类相关联的视图类的指针,当为NULL时,表示一切的视图都需求更新。n阐明:OnUpdate函数是一个虚函数,它担任更新数据,对文档数据的正确显示起必要的支持作用。n4.OnInitialUpdate函数n函数原型如下:nvo

36、id OnInitialUpdate();n阐明:OnInitialUpdate函数用于初始化视图类的数据成员。n5.IsSelected函数n函数原型如下:nvirtual BOOL IsSelected(const CObject*pDocItem)const;n阐明:判别指定的文档工程能否被选中,假设没有选中,那么前往零值,否那么前往非零值。n该函数由框架调用,检查指定的文档工程能否被选中。pDocItem为指向要测试的文档工程的指针。n6.OnScroll 函数n函数原型如下:nvirtual BOOL CView:OnScroll(UINT nScrollCode,UINT nPos

37、,BOOL bDoScroll=TRUE);n阐明:框架调用这个函数以确定视图能否可以滚动。假设bDoScroll为TRUE,并且视图确实被滚动了,那么前往非零值;否那么前往零。假设bDoScroll为FALSE,那么前往当bDoScroll为TRUE时该当前往的值,即使没有做实践的滚动。n7.OnPrepareDC 函数n函数原型如下:nvirtual void OnPrepareDC(CDC *pDC, CPrintInfo *pInfo=NULL);n阐明:在调用OnDraw()函数前允许由MFC调用该函数修正设备描画表。其中,参数pDC为指向设备环境的指针,用于画出文档的图像。pInf

38、o 为指向CPrintInfo构造的指针,假设OnPrepareDC是为打印或打印预览调用的,那么该构造描画了当前打印义务,m_nCurPage成员指定了要打印的页数。假设OnPrepareDC是为屏幕显示而调用的,那么这个参数为NULL。n在以下情况下,应该重载OnPrepareDC:n(1)要为指定的页面调整设备环境的属性。例如,假设想要设置设备环境的映射方式或者其他特征,那么应在这个函数中完成这些操作。n(2)要实现打印时的分页。通常该当在打印开场时利用OnPreparePrinting成员函数来指定文档的长度。但是,假设并不知道文档确实切长度例如,当打印数据库中未知数量的记录时,那么应

39、重载OnPrepareDC函数,以便在打印时检测能否到了文档的末尾。假设曾经没有文档需求打印了,将CPrintInfo构造的m_bContinuePrinting成员设为FALSE。n(3)要按页发送打印机的本义序列码。要在OnPrepareDC中发送本义序列码,那么应调用pDC成员的Escape成员函数。n除了该函数,视图类还提供了其他4个关于打印的函数。nOnBeginPrinting函数:重载该函数可以创建打印文档所需求的资源。nOnEndPrinting函数:重载该函数可以释放在OnBeginPrinting函数中创建的资源。nOnPreParePrinting函数:重载该函数可以提供

40、文档的最大打印页数。nOnPrint函数:重载该函数可以提供如打印页眉页脚等的附加打印效力。7.3.3 视图的操作方法nCView 类及其派生视图类是用户的数据窗口,它控制着运用程序文档内容的显示以及用户和运用程序文档的交互。同时,CView类的派生类分别支持各种不同的功能,可以根据需求选择适当的派生类。n对视图操作的普通步骤如下:n1获得与其相关联的文档对象指针。在视图类中可用GetDocument获取与之关联的文档对象的指针,获得对文档数据、对象、对象集合的访问。例如,CDocument*pDoc=GetDocument()。n2在OnDraw函数中添加要重新绘制的模块。n在OnDraw函

41、数中对需求重新绘制的功能模块再次操作,以防止在刷新视图时所绘内容丧失。例如,在该函数外绘制了一条直线pDC-LineTo(50,100),假设没有在这个函数内重新调用绘制直线的操作,在视图刷新后将看不到所绘直线。n3运用OnUpdate函数更新、同步数据。nOnUpdate函数担任更新数据,提供对文档正确显示的支持。数据一旦发生变化,利用这个函数就可以坚持文档和视图中数据的一致性。n4经过界面与用户交互。nWindows规范音讯是直接发送到视图对象的。在处置各种命令音讯时,视图类的优先级也比较高,而且视图中显示文档数据。因此,运用视图对象对用户输入进展呼应是理所当然的。n刷新视图时默许的函数调

42、用过程是CDocument:UpdateAllViews()-CView:OnUpdate()-CWnd:Invalidate()-OnPaint()-OnDraw()。7.4 根底实例 单文档运用程序n1.编程要求n编写一个简易的存储学生成果信息的程序,详细功能要求为:首先经过对话框来输入一个学生记录,包括学生的姓名、学号和3门课程的成果。然后,将记录内容保管到一个对象数组集合类对象中,最后经过文档序列化将记录保管到一个文件中。当添加记录或翻开一个记录文件时,还会将数据显示在文档窗口视图中。n2.编程实现n1添加用于输入学生成果信息的对话框n2添加一个CStudentScore类并使其可序列

43、化n3添加并处置菜单项n4完善代码n5编译运转并测试,结果如图7-10所示7.5 提高实例 多文档运用程序n1.编程要求n编写一个一档多视的程序,在各自MDI文档窗口中包含同一个视图类的多个视图对象。这个实例可以为同一个文档数据提供两种不同的显示和编辑方式,其效果如图7-11所示。n在左边的窗格中,用户可以输入起点坐标和终点坐标,相应的右边窗格中就会显示出以输入的起点和终点为坐标的一条直线;也可以在右边窗格中经过按鼠标左键拖动的方法改动左边窗格中的起点坐标和终点坐标,并在右边窗格中显示出相应的直线。n2.编程实现n1利用MFC AppWizard创建一个多文档运用程序DrawLineMDIAp

44、p。在“MFC运用程序导游-步骤6共6步对话框中为CDrawLineMDIAppView类选择基类“CFormView,如图7-12所示,其他步骤运用默许值即可。n2按图7-12的规划添加所需控件,并对其进展相应的设置。该运用程序所需控件有3个组框,4个静态控件和4个编辑框。在任务区的ResourceView页面中双击Dialog下的“IDD_DRAWLINEMDIAPP_FORM,添加控件。n最后,为编辑框控件添加成员变量。n3添加CDrawLineMDIAppDoc和CDrawLineMDIAppView类代码。n首先,在CDrawLineMDIAppDoc类中添加两个公有型的CPoint

45、数据成员m_startPoint和m_endPoint,分别表示直线的开场坐标和终止坐标。n然后在CDrawLineMDIAppDoc类的构造函数内添加以下代码以初始化坐标。nCDrawLineMDIAppDoc:CDrawLineMDIAppDoc()nn m_startPoint.x=m_startPoint.y=0;n m_endPoint.x=m_endPoint.y=0;nn切换到MFC ClassWizard的Message Maps标签页,在CDrawLineMDIAppView类中为4个编辑框添加EN_CHANGE音讯映射,将它们的映射函数名都设为OnChangeEdit,并添加如下代码以接纳编辑框控件的值。nvoid CDrawLineMDIAppView:OnChangeEdit() nn/从编辑框中获取数据nUpdateData();nCDrawLineMDIAppDoc*pDoc=(CDrawLineMDIAppDoc*)GetDocument();n/直线

温馨提示

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

评论

0/150

提交评论