在多文档MFC应用程序执行过程中,创建了多于一个的文档类、视图类、子框架类对象和一个主框架类、应用类对象。这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实现在文档、视图、框架类对象、应用程序类对象间相互引用和调用。如下:
       1,视图类对文档类的使用
       视图类对象的作用是在客户区显示文档类对象的内容,两者之间的调用最为常用。在视图类中,通过以下函数得到文档类对象的指针。在视图类CDrawView中可以找到一个函数:
       public:
       CDrawDoc* GetDocument();
       在视图类CDrawView的成员函数中,可以通过以下代码调用GetDocument函数得到当前文档类对象指针:
       CDrawDoc* pDoc = GetDocument();
       ASSERT_VALID(pDoc);
       得到指向当前文档类对象的指针pDoc后,同使用普通C++类的指针一样可以调用文档类的成员变量和成员函数了(只能调用public型的)。
       2,在框架类中获得当前的文档和视图类对象指针
       在主框架类CMainFrame和子框架类CChildFrame中,都可以利用基类的函数,得到指向当前活动的文档类和视图类对象的指针。下面的代码可以获得指向当前活动的文档类对象和视图类对象的指针:
       CDrawDoc* pDoc = (CDrawDoc*)GetActiveDocument();
       CDrawView* pView = (CDrawView*)GetActiveView();
       3,获得应用程序类对象的指针
       在MFC应用程序运行的过程中,自始自终存在一个应用类对象,可以在MFC派生类或非MFC派生类中,通过全局API函数AfxGetApp得到应用类对象指针。如可以在应用程序Draw中的任何地方,通过以下代码获得指向应用程序类对象的指针:
       CDrawApp* pWinApp = (CDrawApp*)AfxGetApp();
       4,从应用程序对象中获得主框架类对象的指针
       通过MFC应用程序的应用类对象,可以获得指向当前系统的主框架类对象的指针,在应用类CWinApp中有一个数据成员m_pMainWnd,这个数据成员保存了指向应用程序主框架类对象的指针:
       CMainFrame* pFrame = (CMainFrame*)(AfxGetApp->m_pMainWnd);
       在视图类、文档类,以及非MFC派生类的成员函数(如全局函数)中,是通过API函数AfxGetApp()获得指向应用类对象的,再调用以上代码,得到指向主框架类对象的指针。
       通过API函数AfxGetApp()得到指向应用程序类对象的指针,再通过应用程序类对象得到指向主框架类对象的指针,通过主框架指针又可以获得指向当前活动的文档和视图类对象的指针。这种调用可以保证在各种情况下,获得指向MFC应用程序中各主要框架类对象的指针,通过指针使用各框架类对象的成员(数据或函数)。

========================================================================================================
========================================================================================================

框架、文档、视图类之间的调用关系

1、主框架(CFrameWnd)中访问视图(CView)
CView* GetActiveView() const;
通常定义的视图为CView的派生类,在调用自定义视图对象的方法时

应该这样写:((CMouseKeyView*)GetActiveView())->MyFunc();

2、主框架(CFrameWnd)中访问文档(CDocument)
GetActiveDocument,返回CDocument对象;

3、在视图(CView)中访问文档(CDocument)
inline CMouseKeyDoc* CMouseKeyView::GetDocument()
    {return (CMouseKeyDoc*)m_pDocument;}

4、在视图(CView)中访问框架(CFrameWnd)
CFrameWnd* GetParentFrame() const;

5、在文档(CDocument)中访问框架(CFrameWnd)
CWnd* AfxGetMainWnd();
CWnd* AfxGetApp()->m_pMainWnd;

6、在文档(CDocument)中访问视图(CView)
UpdateAllViews
功能:通知所有的视图文档已被修改的信息
原型:
    void UpdateAllViews(
      CView* pSender, // 要更新的视图指针,如果希望更新所有视

图,将此参数设为NULL
      LPARAM lHint=0L, // 包含更改消息的通知
      CObject* pHint=NULL // 保管更改消息的对象
    }

7、在其他类中访问文档类(CDocument)
CDocument* GetDocument()
{
    CFrameWnd* frm=(CFrameWnd*)::AfxGetMainWnd();
    ASSERT(frm);
    CDocument* pDoc=frm->GetActiveDocument();
    ASSERT(pDoc);
    ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc)));
    return (CMouseKeyDoc*)pDoc;
}

框架、文档、视图类之间的调用关系相关推荐

  1. MFC 单文档 视图类中CMyDoc* GetDocument() const编译时错误:缺少“;”(在“*”的前面)...

    转:https://blog.csdn.net/hanjieson/article/details/8194337 造成原因:在其他的类之中使用到MyView.h的头文件 解决方案 :在加MyView ...

  2. 玩转MFC文档视图架构编程1——深入浅出MFC文档/视图架构之基本概念深入浅出MFC文档/视图架构之文档

    原创地址: 深入浅出MFC文档/视图架构之基本概念 http://iis.xrtvu.com/Tech/ShowArticle.asp?ArticleID=276 深入浅出MFC文档/视图架构之文档模 ...

  3. 深入理解文档/视图框架体系_九宫格项目开发感悟

    1.项目起源以及采用文档/视图框架体系缘由 我们整天都在说:文档保存项目的数据并处理项目上的数据:视图通过关联获得文档的数据并进行可视化:主窗口框架接收外部事件消息并进行消息分配.这句口头禅感觉接触过 ...

  4. wxWidgets:文档/视图框架

    wxWidgets:文档/视图框架 wxWidgets:文档/视图框架 wxDocument 概览 wxView 概览 wxDocTemplate 概述 wxDocManager 概述 文档/视图框架 ...

  5. C++--深入分析MFC文档视图结构(项目实践)

    1 必备基础知识概述 1.1 MFC 文档视图结构程序结构总揽 当我们使用 MFC AppWizard 生成一个 MFC 程序,选用所有默认的设置(当然也是 Multiple Documents ,本 ...

  6. MFC让文档/视图结构程序支持滚动条

    MFC让文档/视图结构程序支持滚动条 2009-06-30 09:26要通过滚动条显示文档,还必须知道文档滚动到了什么位置:一旦用户拖动滚动条时要告诉视图改变在文档中 的位置.所有这些,由MFC的CS ...

  7. 深入分析MFC文档视图结构(项目实践)

    文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分 ...

  8. MFC之文档/视图结构应用程序

    文档/视图结构应用程序 一.文档/视图结构分析 MFC 通过多个类提供了对程序框架的支持,使用这些类可以简单地实现文档/视图结构:其中主要包括以下五个类: 应用程序类(CWinAPP):是 MFC 程 ...

  9. MFC应用程序框架-文档/视结构

    MFC应用程序框架-文档/视结构 1.MFC单文档应用程序结构 2.文档对象 2.1基类CDocument 2.2在应用程序中使用文档类的典型步骤 3.视的对象 3.1基类CView 3.2常用的CV ...

最新文章

  1. python3 missing 1 required positional argument 错误
  2. Java-Web 监听器和过滤器
  3. 【计算几何】多边形点集排序
  4. java 打包成服务_maven javaProject打包发布成服务
  5. 浅谈JavaScript、ES5、ES6
  6. c++怎么输入带有空格的字符串_杭电OJ 字符串处理类部分题解
  7. 大于3小于4的整数bleem_比三大,比四小的整数是存在的吗?
  8. 服务器复制文件进程,服务器复制文件进程
  9. 浅谈JavaScript代码预解析 + 示例详解
  10. Zookeeper-单机/集群安装
  11. c# 时间格式化为英文_C#格式化英文字母的三种方法
  12. 饿汉式单例模式,懒汉式单例模式
  13. 西门子PLC,STEP7 v5.5安装以及仿真软件Plcsim v5.4 sp5安装
  14. Catboost参数全集
  15. HoloLens2开发
  16. Java Graphics绘制表格和直方图
  17. Windows10 笔记本从睡眠状态唤醒时取消输入密码的方法
  18. 多个视频文件合成画中画效果(Python版)
  19. Rust语言教程(1) - 一门没有GC的语言
  20. ClickableSpan 去除下划线

热门文章

  1. ELK 环境搭建1-Elasticsearch
  2. jwt思维导图,让jwt不再难懂
  3. Linux shell编程学习笔记-----第十四章
  4. Unity3D绑定button监听事件
  5. 每次都觉得很神奇的JS
  6. 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
  7. “Duke选择大奖”荟萃2009最具创新的Java技术应用
  8. 前嗅ForeSpider教程:网站登录配置
  9. 香港居民换领新智能身份证 市民对办理过程表满意
  10. 使用Innobackupex快速搭建(修复)MySQL主从架构