第七章文档和视图 本童导读 ■理解文档类和视图类二者间的关系 掌握在视图类中利用 GetDocumeηt函数获得文档类的 指针,并借助此指针更新文档类中的数据的方法。 掌握在文档类中当文档薮据发生了改变时利用 UpDateAllViews0通知所有的视图对象的方法,通过调 用文档类的 UpDateAllViews0函数去调用每个视图的成 员函数 OnUpdateo函数对相应的视图进行数据更新。 ■掌握视图类的 On Draw函数的调用机理。 ■了解SD文档序列化的工作原理和实现方法。 U回
返回 1 第七章 文档和视图 本章导读 理解文档类和视图类二者间的关系。 掌握在视图类中利用GetDocument函数获得文档类的 指针,并借助此指针更新文档类中的数据的方法。 掌 握 在 文 档 类 中 当 文 档 数 据 发 生 了 改 变 时 利 用 UpDateAllViews()通知所有的视图对象的方法,通过调 用文档类的UpDateAllViews()函数去调用每个视图的成 员函数OnUpdate()函数对相应的视图进行数据更新。 掌握视图类的OnDraw函数的调用机理。 了解SDI文档序列化的工作原理和实现方法
7.1文档类和视图类间的关系 视图和用户的文档间是紧密相连的,文档类用于管理 应用程序的数据,包括对数据读取、存储和修改。视图 类用于显示文档并管理与用户的交互。这种文档和视图 的结合,称为“文档图”结构机制。 定义和操纵数据的代码在文档类中实现;显示数据、 解释用户输入的代码在视图类中实现。 个SDI(单文档界面)应用程序同一时刻只能打开 个文档 在一个MDI(多文档界面)应用程序中,可以有几种不 同类型的文档,每个文档可以有一个或多个视图。同 时刻可以打开几个文档,打开的文档经常使用适合该文 档的工具栏和菜单。 U回
返回 2 7.1 文档类和视图类间的关系 ➢ 视图和用户的文档间是紧密相连的,文档类用于管理 应用程序的数据,包括对数据读取、存储和修改。视图 类用于显示文档并管理与用户的交互。这种文档和视图 的结合,称为“文档/视图”结构机制。 ➢ 定义和操纵数据的代码在文档类中实现;显示数据、 解释用户输入的代码在视图类中实现。 ➢ 一个SDI(单文档界面)应用程序同一时刻只能打开 一个文档。 ➢在一个MDI(多文档界面)应用程序中,可以有几种不 同类型的文档,每个文档可以有一个或多个视图。同一 时刻可以打开几个文档,打开的文档经常使用适合该文 档的工具栏和菜单
7.2常用的成员函数 在SDI(单文档界面)应用程序中,文档类的基类是 CDocument,它可以有一个或多个视图类,而所有这些视 图类的基类都是CⅤeW,任何一个应用程序的文档类和视 图类都是由这两个类派生出来的。 721 C View类的 GetDocumente0函数 个视图对象只有一个与之相联系的文档对象,它所包 含的 GetDocumentO函数可以实现在视图中得到与之相联 系的文档。 CView类及其派生类只需调用 GetDocument 函数就可以取得 CDocument类的对象指针,从而用此指针 来访问文档类中的的所有可见的数据。 U回
返回 3 7.2 常用的成员函数 在SDI(单文档界面)应用程序中,文档类的基类是 CDocument,它可以有一个或多个视图类,而所有这些视 图类的基类都是CView,任何一个应用程序的文档类和视 图类都是由这两个类派生出来的。 7.2.1 CView类的GetDocument()函数 一个视图对象只有一个与之相联系的文档对象,它所包 含的GetDocument()函数可以实现在视图中得到与之相联 系的文档。CView类及其派生类只需调用GetDocument() 函数就可以取得CDocument类的对象指针,从而用此指针 来访问文档类中的的所有可见的数据
7.2常用的成员函数 GetDocument函数的原型为 CDocument*C View: GetDocument() const 另外, CDocument类中的 GetNext View函数可以在文档类 中获得视图类的指针 CDocument类先调用 Getfirst view position函数得到所有 有关该文档类对象的第一个视图,再用该函数的返回结果 调用 GetNext View函数,即可得到 CView类的指针,从而 借此访问 CView类的数据。 U回
返回 4 GetDocument函数的原型为: CDocument* CView::GetDocument( ) const; 另外,CDocument类中的GetNextView()函数可以在文档类 中获得视图类的指针 CDocument类先调用GetFirstViewPosition()函数得到所有 有关该文档类对象的第一个视图,再用该函数的返回结果 调用GetNextView()函数,即可得到CView类的指针,从而 借此访问CView类的数据。 7.2 常用的成员函数
7.2常用的成员函数 这两个函数的原型为 virtual position CDocument Get First viewPosition(const virtual C View* CDocument: GetNext View( Position& pOsition cons 如 void CMy Doc: OnRepaintAll Views i POSition pos=GetFirst ViewPositionO while(pos!= NULL) i CView* p View=GetNext View(pos) p View->Update Window;) U回
返回 5 这两个函数的原型为: virtual POSITION CDocument::GetFirstViewPosition( ) const; virtual CView* CDocument::GetNextView( POSITION& rPosition ) const; 如: void CMyDoc::OnRepaintAllViews() { POSITION pos = GetFirstViewPosition(); while (pos!= NULL) { CView* pView = GetNextView(pos); pView->UpdateWindow(); } } 7.2 常用的成员函数
7.2常用的成员函数 722 CDocument类的 UpDateAllViewso函数 通过文档类的 UpDateAll Views)函数调用每个视图的成员 函数 OnUpdateo函数对相应的视图进行数据更新。 UpDate All views(函数的原型为 UpDate All Views(C View*pSender, LPARAM THint=oL, CObject* pHint=NULL) U回
返回 6 7.2.2 CDocument 类的UpDateAllViews()函数 通过文档类的UpDateAllViews()函数调用每个视图的成员 函数OnUpdate()函数对相应的视图进行数据更新。 UpDateAllViews()函数的原型为: void UpDateAllViews(CView*pSender,LPARAM lHint=0L,CObject*pHint=NULL); 7.2 常用的成员函数
7.2常用的成员函数 723 C View类的 OnUpdate(函数 当应用程序调用了 CDocument类的 UpDate Allviewse)函数时, 应用程序框架就会相应地调用该函数。通常在派生视图类 中的 OnUpdateo函数要对文档进行访问,读取文档的数据, 然后再对视图的数据成员或控制进行更新。 Onupdate(O函数原型如下 virtual OnUpdate(Cview*pSender, LPARAM THint, CObject* pHint) 函数中参数的说明同函数 UpdateAll Views0 利用 OnUpdateo函数,可以使视图的某一部分无效,以便 触发视图类的 Ondraw)函数。在默认情况即 Thint==0, pHint=NULI时,函数 OnUpdate(使视图的整个客户 区无效;如果想要视图的某一部分无效,则需要定义相关 的提示(hint)参数给出准确的无效区域 用 OnUpdate(函数来更新视图的滚动范围。 U《回
返回 7 7.2.3 CView类的 OnUpdate()函数 当应用程序调用了CDocument 类的UpDateAllViews()函数时, 应用程序框架就会相应地调用该函数。通常在派生视图类 中的OnUpdate()函数要对文档进行访问,读取文档的数据, 然后再对视图的数据成员或控制进行更新。 OnUpdate()函数原型如下: virtual void OnUpdate(CView*pSender,LPARAM lHint,CObject* pHint); 函数中参数的说明同函数UpdateAllViews()。 利用OnUpdate()函数,可以使视图的某一部分无效,以便 触发视图类的 OnDraw() 函 数 。 在默认情况即 lHint=0,pHint=NULL时,函数OnUpdate()使视图的整个客户 区无效;如果想要视图的某一部分无效,则需要定义相关 的提示(hint)参数给出准确的无效区域。 用OnUpdate()函数来更新视图的滚动范围。 7.2 常用的成员函数
7.2常用的成员函数 7.2.4 Cview类的0 nInitialUpdate函数 当应用程序启动或当用户从【File】菜单中选择【New】 或【Open】命令时, CView类中的虚函数 OnInitialupdate()都会被自动调用。该函数的作用就 是调用无提示参数(1Hint=0, pHint=NULL)的 OnUpdate(函数 U回
返回 8 7.2.4 Cview 类的OnlnitialUpdate()函数 当应用程序启动或当用户从【File】菜单中选择【New】 或 【Open】 命 令 时 , CView 类 中 的 虚 函 数 OnInitialUpdate()都会被自动调用。该函数的作用就 是调用无提示参数 ( lHint=0 , pHint=NULL ) 的 OnUpdate()函数。 7.2 常用的成员函数
7.2常用的成员函数 72.5MFC应用程序中各个类对象间的相互调用关系 1).在框架窗口类中获得当前的文档类和视图类对象的指 针 在一个MD应用程序中,在框架窗口类(主框架窗口类 或子框架窗口类)中,可以利用基类 FRame Wnd的 GetActive document函数,得到指向当前活动的文档类对 象的指针,也可用基类 FRame Wnd的 GetActive view函数, 得到视图类对象的指针。这两个函数的原型如下 virtual CDocument* GetActiveDocument() CView* GetActive View()const U回
返回 9 7.2.5 MFC应用程序中各个类对象间的相互调用关系 (1). 在框架窗口类中获得当前的文档类和视图类对象的指 针 在一个MDI应用程序中,在框架窗口类(主框架窗口类 或子框架窗口类)中, 可以利用基类 CFrameWnd的 GetActiveDocument函数,得到指向当前活动的文档类对 象的指针,也可用基类CFrameWnd的GetActiveView函数, 得到视图类对象的指针。这两个函数的原型如下: virtual CDocument* GetActiveDocument( ); CView* GetActiveView( ) const; 7.2 常用的成员函数
7.2常用的成员函数 (2)获得应用程序类对象的指针 在MFC应用运行过程中,自始至终存在一个应用程序类对 象,通过全局的 Windows apl函数 AfXGetApp得到应用程 序类对象的指针,该函数的原型为 CWinApp*AfxGetApp() (3).从应用程序类对象中获得主框架类对象的指针 在MD应用程序中,通过MFC的应用程序类对象,可以获 得指向当前系统的主框架窗口类对象的指针,在应用程序 类 CWinApp中有一个数据成员 m mAin Wnd,这个数据成 员保存了指向应用程序主框架类对象的指针,通过此数据 成员可以获得指向主框架类对象的指针。 U回
返回 10 (2). 获得应用程序类对象的指针 在MFC应用运行过程中,自始至终存在一个应用程序类对 象,通过全局的Windows API函数AfxGetApp得到应用程 序类对象的指针,该函数的原型为: CWinApp* AfxGetApp( ); (3). 从应用程序类对象中获得主框架类对象的指针 在MDI应用程序中,通过MFC的应用程序类对象,可以获 得指向当前系统的主框架窗口类对象的指针,在应用程序 类CWinApp中有一个数据成员m_pMainWnd,这个数据成 员保存了指向应用程序主框架类对象的指针,通过此数据 成员可以获得指向主框架类对象的指针。 7.2 常用的成员函数