信息科技3章MFC应用程序框架(2).pptVIP

  • 3
  • 0
  • 约1.74千字
  • 约 14页
  • 2019-01-29 发布于江西
  • 举报
第3章 MFC应用程序框架(2);Document/View结构;在MFC中引入了文档/视(Doc/View)结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。 用AppWizard生成SDI程序,看一下由框架生成的类。 一个完整的应用一般由五个类组成: 1. CWinApp应用程序类 2. CFrameWnd窗口框架类 3. CDocTemplate文档模板类 4. CDocument文档类 5. CView视类。 ;应用程序对象;virtual BOOL OnNewDocument() 文件?新建,此菜单的消息响应函数OnFileNew(在工程中不可见)在MFC内部响应,此函数创建文档对象(生命期直到主框架窗口被销毁),框架对象和视对象,OnFileNew再调用虚函数OnNewDocument()来初始化文档对象的数据成员。 virtual void DeleteContents() 清理文档数据 ;一般来讲我们只需对文档和视进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是MS设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。 ;在应用中一个视对应一个文档,但一个文档可以包含多个视。 一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。 每一个视都是一个子窗口,在SDI中框架窗口由CFrameWnd派生,在MDI中主窗口框架由CMDIFrameWnd派生,子窗口由CMDIChildWnd派生。 一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。 ;文档/视图结构的优点:;包含多个类的MFC文档/视图结构应用程序要管理这些类中的数据,除了考虑在程序的哪一部分拥有数据和在哪一部分显示数据,一个主要的问题是文档数据更改后如何保持视图显示的同步,即文档与视图如何进行交互。 在文档、视图和应用程序框架之间包含了一系列复杂的相互作用过程,文档与视图的交互是通过类的公有成员变量和成员函数实现的。;1.视图类的成员函数GetDocument() 一个视图对象只有一个与之相关联的文档对象。在MFC应用程序中,视图对象通过调用成员函数函数GetDocument()得到当前文档。GetDocument()是视图类的成员函数,调用它可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有成员。 当利用MFC AppWizard向导创建一个SDI单文档应用程序Mysdi时,生成了视图类的一个派生类,并在派生类中定义了函数GetDocument()。;CMysdiDoc* CMysdiView::GetDocument() { ASSERT(m_pDocument- IsKindOf(RUNTIME_CLASS(CMysdiDoc))); return (CMysdiDoc*)m_pDocument; // m_pDocument是CArchive类的数据成员, // 指向当前文档对象 }; 一个文档对象可以有多个与之相关联的视图对象,当一个文档的数据通过某个视图被修改后,与它关联的每一个视图都必须反映出这些修改。因此,视图在需要时必须进行重绘,即当文档数据发生改变时,必须通知到所有相关联的视图对象,以便更新所显示的数据。 更新与该文档有关的所有视图的方法是调用成员函数CDocument::UpdateAllViews()。; 当程序调用CDocument::UpdateAllViews()函数时,实际上是调用了所有相关视图的OnUpdate()函数,以更新相关的视图。需要时,可以直接在视图派生类的成员函数中调用该函数刷新当前视图。;在OnUpdate()中通过调用函数CWnd::Invalidate()刷新整个客户区,我们也可以在自己的CWnd派生类中直接调用函数Invalidate()。

文档评论(0)

1亿VIP精品文档

相关文档