zoukankan      html  css  js  c++  java
  • 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.文档的视图对象属于不同的视图类,但所有的视图对象位于同一文档框架窗口中。

    希望对大家有所帮助!

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/WayneLiu/p/5060822.html
Copyright © 2011-2022 走看看