【转】文档类、子框架类及视图类的关系及如何相互调用

MFC初学者:MFC程序中类之间的相互访问的常规方法。          这是本人在学习MFC的过程中整理的,其实就是一小篇学习笔记,算不得什么文章,共享出来只是希望能够给那些MFC初学者一点点帮助,并且希望得到老鸟们的指正。呵呵,闲话不说进入正文。         基于文档-视图结构的应用程序,可以将数据从用户对数据的观察中分离起来。在此类应用程序中,数据一般放在文档类中,而应用的显示一般由视图视图类负责。以显示图像为例,图像的数据存放在文档类中,要 阅读详情

原文:http://blog.youkuaiyun.com/hank209/archive/2008/12/25/3601178.aspx

 

了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因 此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。  
  几个概念:  
  (虽然大家都知道了,雷神还是要重申一次)  
  文档对象:是用来保存数据的。  
  视图对象:是用来显示和编辑数据的。  
  应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同, 怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。  
  文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:  
   
  BOOL   CMyHtmlApp::InitInstance()  
  {  
  //。。。。。。  
  CSingleDocTemplate*   pDocTemplate;  
  pDocTemplate   =   new   CSingleDocTemplate(  
  IDR_MAINFRAME,  
  RUNTIME_CLASS(CMyHtmlDoc),  
  RUNTIME_CLASS(CMainFrame),               //   main   SDI   frame   window  
  RUNTIME_CLASS(CMyHtmlView));  
  AddDocTemplate(pDocTemplate);  
  //。。。。。。  
  }  
   
  单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢 了。  
  多文档:就是你可以打开多个文件,和文档类型也无关。你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。  
   
  何时需要文档/视图框架结构?  
  首先你可以不使用文档视图这种框架结构,即便是在MFC中。你可以在你需要的时候选择使用这种方式。你可以完成一个只有视图没有文档的程序,例如一个基于 对话框的应用。  
  哪什么时候需要呢?  
  当你想将你的数据层和界面层分开的时候。  
  通常我们对数据的操作放在文档类中,例如存取,打开,关闭。在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更 新,那么程序会将你对数据所做的改变呈现给你的程序的用户。由此可见视图的作用就是提供一个用户和数据之间进行数据交换的界面,它的作用就是在需要的时候 显示数据,并在需要的时候提供输入界面。当用户输入后实际的数据操作工作是由文档类来做的。那框架类有在做什么呢?  
  框架类是为了便于管理你的文档类和视图类而存在的。通常我们的操作都是通过视图窗口完成,消息由视图进行接收并且进行处理。所以消息映射定义一般在视图 中。但如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。另外框架窗口可以方便的处理非窗口消息。  
   
  再来说一边典型的单文档程序的生成过程(不完整,只挑有用的)  
  1、   CwinApp对象被建立,这个对象是全局的且只能有一个,名字叫theApp。这时你可以完成一些工作,例如对注册表的操作,(如果你想写一个不修改注 册表的软件,需要在这里做写工作)  
  2、   在InitInstance()函数中创建文档模板,文档模板以CruntimClass静态成员指针做构造参数。  
  3、   执行MFC框架默认的命令行参数。命令行参数有很多其中之一是,Cmd1它会创建一个新文件。(如果没有命令行参数则执行默认的ID_FILE_NEW)  
  4、   文档模板的实例根据三个类的动态创建信息创建出文档、视图、框架。  
  5、   对文档、视图、框架进行初始化。  
   
  我们对文档,视图,框架如何产生以及他们的用途有了一定的了解,如何有效的使用它们呢。  
   
  文档,视图,框架之间的相互作用。  
  由上面的典型的单文档程序的生成过程可以看出一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd框架类,CDocument文档 类,CView视图类。我将四个类常用的成员函数列出,大家一看便知。不过参数,返回值均未列出,大家可以从MSDN上了解更多。几个重要的虚函数也未做 说明。大家自己看吧。  
   
  通过全局函数AfxGetApp可以得到CWinApp应用类的全局对象theApp.  
  CwinApp  
  数据成员:  
  m_pszAppName   应用程序名称  
  m_pszExeName   可执行文件的名称  
  m_pszProfileName   INI文件的名  
  m_pszRegistryKey   注册表或INI文件的KEY  
  m_hInstance   实例的句柄  
  m_pMainWnd   为框架窗口指针  
  成员函数:  
  InitInstance()     //初始化  
  ParseCommandLine()   //完成命令行的解析处理  
   
  CFrameWnd  
  GetActiveDocument()   //得到当前活动文档指针  
  GetActiveView()   //得到当前活动视指针  
  SetActiveView()   //设置当前视图为活动视图  
   
  CDocument  
  OnNewDocument()  
  OnOpenDocument()  
  OnSaveDocument()  
  OnFileClose()  
  //以上是用来对文档的操作  
  GetFirstViewPosition()   //文档对象链表中的第一个文档位置  
  GetNextView()   //下一个  
  //以上是用来遍历所有和文档关联的视图  
  GetDocTemplate()得到文档模板指针  
  AddView()   //增加一个视图  
  RemoveView()   //删除一个视图  
  UpdateAllView()   //更新所有视图  
   
  Cview  
  GetDocument()得到对应的文档指针    
   
  其他的就不列出了,大家还是看MSDN。你可以直接查看CWinApp应用类,CFrameWnd框架类,CDocument文档类,CView视图类的 类成员。  
   
   
  最后说说几个常见到的问题。  
  1,为什么在对话框的应用程序中没有发现文档模板?  
  默认的对话框程序没有使用文档/视图框架结构。  
   
  2 ,如果我使用数据库作为数据源是否意味着可以不需要文档类?  
  看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用。  

------------------------------------------------------------------------------------------------------------

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

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;
  }

[注:资料转载自网上]

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例) 本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。 阅读详情

相关推荐

若依Vue整合积木报表实战:Token安全校验全流程解析

本文详细解析了在若依Vue后台系统中安全集成积木报表的全流程,重点阐述了Token安全校验的核心机制。通过前端菜单配置、Token传递、后端权限拦截及自定义Token服务实现,构建了一套完整的企业级报表访问安全防线,确保核心业务数据的安全可控。

t8u9v0的博客 576

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

在多文档MFC应用程序执行过程中,创建了多于一个的文档类、视图类、子框架类对象和一个主框架类、应用类对象。这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实现在文档、视图、框架类对象、应用程序类对象间相互引用和调用。如下: 1,视图类对文档类的使用 视图类对象的作用是在客户区显示文档类对象的内容,两者之间的调用最为常用。在视图类中...

weixin_30480075的博客 297

SAP采购申请详述;以及采购计划协议/交货计划行

SAP采购申请详述;以及采购计划协议/交货计划行

saplakes的博客 4337

MFC应用程序之视图、文档、框架、应用程序类对象间的相互引用及调用

新建MFC应用程序Draw 1.视图类对文档类的调用 视图类对象的作用是在客户区显示文档类对象的内容,两者之间的调用函数最为常用。在视图类对象中,通过GetDocument()函数得到文档类对象的指针。在视图类CDrawView中可以找到GetDocument()函数。 Public: CDrawDoc * GetDoucument(); 在实现文件 drawview.cpp 中,...

weixin_30906671的博客 380

ADS入门学习笔记——射频振荡器的设计

振荡器是射频系统中的基本部件之一,可以将直流功率转换为射频功率,在特定的频率点建立起稳定的正弦振荡,成为所需的射频信号源。

weixin_42126696的博客 8942

OpenClaw实战-行政与HR必备:AI驱动的办公自动化

智能会议纪要自动生成会议时间智能协调自动提醒和跟进简历智能筛选和匹配度分析面试安排自动化入职办理流程化通知公告一键发布发票识别和报销辅助资产管理数字化让AI处理繁杂的事务性工作,让您有更多时间专注于更有价值的战略和管理任务。

gaoxiang_120的专栏 217

C++-MFC-一图读懂-文档、视图、框架、文档模板及应用程序之间的关系

1.文档、视图、框架定义 2.应用程序、文档、视图、框架、文档模板5者的关系 文档、视图、框架定义 1.1文档类:CDocument 创建、打开、保存 Virtual BOOL OnNewDocument(); Virtual BOOL OnOpenDocum...

aggie4628的专栏 622

一文掌握 Playwright 的详细使用

Playwright 是一个功能强大的浏览器自动化工具,适用于网页自动化测试、数据抓取和网页交互。通过掌握其基础用法和高级功能,你可以轻松实现各种浏览器自动化任务。Playwright 支持多浏览器、多语言,并且具有高效的异步操作能力,是现代浏览器自动化的首选工具之一。

数据知道的博客 1万+

文档类CDocument、子框架类CFrameWnd及视图类CView的关系及如何相互调用

文档类、子框架类及视图类的关系及如何相互调用 收藏 了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。     几个概念:     (虽然大家都知道了,雷神还是要重申一次)    

9922

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

fxshy的博客 462

图神经网络学习笔记-点云数据处理(专题七)

本教程解释了如何利用图神经网络(Graph Neural Networks,GNNs)来处理和训练点云数据。尽管点云默认情况下不具有图结构,但我们可以利用 PyG 的转换工具,将其转化为适合 PyG 所提供的全套 GNN 模型的形式。关键思想是从点云数据中创建一个,通过 GNN 的消息传递机制,从中学习有意义的局部几何结构。这些点的表示可以被用于例如点云分类或分割等任务。

351

[Visual C++系列]3.4 文档,视,框架之间相互作用

3.4 文档,视,框架之间相互作用 一般来说用户的输入/输出基本都是通过视进行,但一些例外的情况下可能需要和框架直接发生作用,而在多视的情况下如何在视之间传递数据。 在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视的情况下菜单的状态和处理映射是和当前活

笨笨D幸福 - 后花园 978

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

文档类CDocument、子框架类CFrameWnd及视图类CView的关系及如何相互调用(转)

文档类、子框架类及视图类的关系及如何相互调用 收藏了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。 几个概念: (虽然大家都知道了,雷神还是要重申一次) ...

weixin_30699465的博客 94

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档类CDocument,子框架类CFrameWnd及视图类CView的关系及怎样相互调用

文档类、子框架类及视图类的关系及如何相互调用 收藏 了解文档和视图的相互作用关系是编写mfc程序的基本功。但是mfc的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。   几个概念:   (虽然大家都知道了,雷神还是要重申一次)

jimonanhai1的专栏 1193

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档类、子框架类及视图类的关系及如何相互调用

一、概念。    1、了解文档和视图的相互作用关系是编写mfc程序的基本功。但是mfc的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。    2、基本概念:      文档对象:是用来保存数据的。     视图对象:是用来显示和编辑数

zhao_mali的专栏 2321

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档类CDocument子框架类CFrameWnd及视图类CView的关系及相互调用

文档对象:是用来保存数据的。   视图对象:是用来显示和编辑数据的。   应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。   文档模板:mfc把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类

曾经沧海 1016

【MFC】文档类、子框架类及视图类的关系及如何相互调用

了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。     几个概念:     (虽然大家都知道了,雷神还是要重申一次)     文档对象:是用来保存数据的。     视图对象:是用

Mr.Out的专栏 2025

深入浅出MFC文档/视图架构之相互关系

1、模板、文档、视图、框架的关系  连载1~5我们各个击破地讲解了文档、文档模板、视图和框架类,连载1已经强调这些类有着亲密的内部联系,总结1~5我们可以概括其联系为:  (1)文档保留该文档的视图列表和指向创建该文档的文档模板的指针;文档至少有一个相关联的视图,而视图只能与一个文档相关联。  (2)视图保留指向其文档的指针,并被包含在其父框架窗口中;  (3)文档框架窗口(即包含视图的MDI子窗

无名剑 1665

MFC框架类、文档类、视图类相互访问的方法

1、获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2、获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); 或者 CMainFrame* pMainFrame = (CMai...

529

MFC中文档视图框架和文档模板之间的关系

转自:http://www.cnblogs.com/tianjinquan/archive/2011/01/18/1938568.html 文档对象:是用来保存数据的。  视图对象:是用来显示和编辑数据的。  应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是

3599

关于在文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法

 最近在网上看到一些关于在文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法,现总结如下:GET  App、、、、、AfxGetInstanceHandle()、、、、、AfxGetApp()GET  Frame->View->Document、、、、、SDI   AfxGetMainWnd() -> GetActiveView() -> GetDocument()、、、、

程序人生 1631
上一篇: 【转】MFC应用程序中处理消息的顺序
下一篇: 【转】MFC窗口销毁过程
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值