• MFC中获得各种指针概述(个人觉得是很重要的重点)


    前言:这学期学习MFC(有点过时的东西),上课时,老师讲到获取当前活动指针,获取视图指针,文档指针,文档模板指针等(已晕)

    后来下来真正写代码的时候发现这些几乎都是需要用到的东西,所以特此记录下,让自己以后方便查找,当然也希望能够帮助到同样有这些疑问的童鞋

    本文主要内容转载自http://www.jizhuomi.com/software/221.html

     

     一.概述

     在VS自动生成的代码中,框架类继承于CFrameWndEx类,文档类继承于CDocument类,视图类继承于CView类。

      CFrameWndEx类又继承于CFrameWnd类,CFrameWnd类中用于管理文档和视图的成员函数包括:

    •        virtual CDocument* GetActiveDocument( );

           获得当前活动视图对应文档对象的指针,如果不存在则返回NULL。

    •        CView* GetActiveView( ) const;

           获得当前活动视图对象的指针,如果不存在则返回NULL。

    •        void SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);

           设置活动视图。参数pViewNew为要激活的视图对象的指针,参数bNotify指定视图是否接收激活通知。

     CDocument类的主要成员函数:

    •        virtual BOOL OnNewDocument( );

           创建新文档。可以重载使用。

    •        virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

           打开文档。参数lpszPathName为要打开的文档的路径。可以重载使用。

    •        virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);

           保存文档。参数lpszPathName指定文档保存到的全路径。可以重载使用。

    •        CDocTemplate* GetDocTemplate( ) const;

           获取此文档类型对应的文档模板对象的指针。如果此文档没有被文档模板管理则返回NULL。

    •        virtual POSITION GetFirstViewPosition( ) const;

           获取文档中视图列表的第一个视图的位置。

    •        virtual CView* GetNextView(POSITION& rPosition) const;

           利用此函数可以迭代处理文档的所有视图。参数rPosition为上一次调用GetFirstViewPosition或GetNextView成员函数返回的POSITION值的引用。

    •        void AddView(CView* pView);

           为文档增加一个视图。参数pView为要增加的视图对象的指针。

    •        void RemoveView(CView* pView);

           移除某个视图与文档的关联。参数pView为要移除的视图对象的指针。

    •        void UpdateAllViews(CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL);

           在文档被更改后调用此函数更新视图。参数pSender指向修改文档的视图,实际应用时常用来指定哪个视图不需要更新,如果更新所有视图则设为NULL,参数lHint包含了文档修改的信息,参数pHint指向存储文档修改信息的对象。

           CView类中与文档/视图结构相关的成员函数包括:

    •        CDocument* GetDocument( ) const;

           获取视图关联的文档对象的指针。如果视图没有关联到文档上则返回NULL

    二.主要讲解文档、视图、框架结构中各对象之间的关系。

    A.各个对象之间的关系

    文档、视图、框架结构中涉及到的对象主要有:应用程序对象、文档模板对象、文档对象、视图对象和框架窗口对象等。

    下面就对它们之间的关系进行总结和概括,并对各个关系中用到的类的成员函数进行介绍。 

           1. 应用程序对象保存了一个文档模板的列表。在任何对象中调用全局函数AfxGetApp都可以获得应用程序对象的指针。

        通过调用CWinAppEx::GetFirstDocTemplatePosition、CWinAppEx::GetNextDocTemplate函数可以遍历所有的文档模板

           2. 文档模板对象用于维护文档、视图和框架窗口的映射关系,它包含有一个已打开文档的列表。

        我们可以通过调用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc来遍历该文档模板对应的所有文档

           3. 框架窗口对象中包含有指向当前活动视图对象的指针。AfxGetApp()->m_pMainWnd即为主框架窗口对象的指针。

        我们可以通过调用CFrameWndEx::GetActiveView来获取当前活动视图对象的指针,并且使用CFrameWndEx::GetActiveDocument函数可以获得当前活动视图对应的文档

           4. 文档对象中维护着该文档的视图列表,以及创建该文档的文档模板对象的指针。

        我们可以通过调用CDocument::GetFirstViewPosition,CDocument::GetNextView来遍历该文档关联的所有视图

        调用CDocument::GetDocTemplate获取创建该文档的文档模板对象的指针。

           5. 视图是框架窗口的子窗口,它保存有指向对应的文档对象的指针。

        我们可以通过调用CView::GetParentFrame获取其所属的框架窗口对象的指针

        调用CView::GetDocument获取该视图对应的文档对象的指针

           另外,在MDI多文档程序中,调用CMDIFrameWnd::MDIGetActive可以获取当前活动的MDI子窗口。

    B.文档和视图的关系

           应用程序可以是单文档程序也可以是多文档程序。单文档程序中主框架窗口和文档框架窗口重合,而多文档程序的主框架窗口中有客户窗口,客户窗口中又包含了多个文档框架窗口。

           文档和视图是一对多的关系。一个文档可以对应多个视图,例如在Word中一个文档有普通视图、大纲视图、Web版式视图、阅读版式视图等多种视图。

        而一个视图只能属于一个文档。最简单的应用程序是单文档单视图程序,除此之外还有单文档多视图程序、多文档程序等。

           每个文档对象都保存着一个视图列表,可以通过CDocument::AddView函数添加视图,通过CDocument::RemoveView函数删除视图,在数据发生变化时调用CDocument::UpdateAllViews函数更新所有视图。

           在MFC中文档可以有三种视图模式:

           1. 文档有多个视图对象,它们是同一个视图类的对象,每个视图对象位于一个独立的文档框架窗口中。

           2. 文档的基于同一个视图类的多个视图对象,位于同一个文档框架窗口中。Word的子窗口就是这种视图模式。

        3.文档的视图对象属于不同的视图类,但所有的视图对象位于同一文档框架窗口中。

    希望对大家有所帮助!

  • 相关阅读:
    2020 Python组蓝桥杯
    Servlet学习
    Tomcat学习
    数据库连接池
    MySQL的设计
    时间复杂度————被list.insert坑了
    PCA 算法核心:高维度向量向低维度投影
    初识Django,了解一下大概流程
    python编程基础之三十八
    python编程基础之三十七
  • 原文地址:https://www.cnblogs.com/WayneLiu/p/5060822.html
Copyright © 2020-2023  润新知