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

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

了解文档和视图的相互作用关系是编写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;
  }

[注:资料转载自网上]


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/xiunai78/archive/2009/07/31/4398713.aspx

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力 文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实 阅读详情

相关推荐

python自动交易 缠论_缠论自动交易系统实现了

一、缘起:缠中说禅的伟大,我想你只要上网搜索一下就知道了,他的才气不用我说,我只想说说他的《教你炒股票》系列文章,108篇文章,将他的股票操盘秘籍全部公开给广大的股友了,更有缠友将其理论写成公式,在网上也是广为流传,深受广大缠友们的喜爱。我也是缠中说禅的忠实崇拜者之一,从2008年开始每天都使用缠论来看盘,特别想将缠论写成交易系统,让计算加来帮助我们自动交易,从而减轻我们盯盘的辛劳,可是苦于没有好...

weixin_39970689的博客 4635

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

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

hank209的VC/MFC学习之旅 1968

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 226

MFC 文档/视图模式之如何获取文档内数据

        一般基于视图/文档的程序都是把自己的数据在文档类里面保存,文档类可以方便地实现打印功能和文件的串行化,在视图里面对文档类里面的数据进行操作和显示。在视图类里面直接有一个GetDocument()方法,所以取得文档类的指针很方便。                   例子很容易,比如在文档类里面定义一个Public类型的变量CString   m_str;  然后在视图里面就可以这样

达中的专栏 1593

Frida精准定位Shopee x-sap-ri动态签名生成函数

x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密

weixin_33978578的博客 609

智能车竞赛新手必看:用AD21从零画一块英飞凌TC264核心板(附开源PCB文件)

本文详细介绍了使用Altium Designer 21(AD21)从零开始设计英飞凌TC264核心板的完整流程,涵盖原理图绘制、PCB布线到最终DRC检查的全过程。针对智能车竞赛新手,提供了实用的硬件设计技巧和开源PCB文件,帮助快速掌握TC264核心板开发。

weixin_27017211的博客 246

MFC如何快速访问视图类和文档类成员

(1)、新建一个mfc单文档工程(在这里工程名称取名为Your) (2)、在CYourView中定义一个全局变量 CYourView* g_cView; (3)、在需要访问的类中添加好相应的头文件,再次申明变量 extern CYourView* g_cView;   g_cView->成员; //访问视图类中的成员   g_cView->GetDocument()-...

weixin_30607029的博客 214

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 446

MFC创建MDI程序一个Doc对应多个View

新建一个多文档的工程 点击确定 中间没有注释说明的就一路Next,知道下面的步骤可以选择CView的基类 点击完成应用程序框架完成 下面,就开始在工程中在插入一个视图类 定义新建类的名称同时选择其基类 点击完成,新类的创建就完成了。

xzm_cn 4153

乐企增值税及附加税费(一般纳税人适用)申报表填报能力说明文档V3.009

申报表填报,是指企业在自有业务系统中将算税结果数据按预填规则要求加工汇总后,进行申报表填报的过程。申报表填报前对纳税申报所需的前提条件进行校验。校验通过后,应用前序算税结果数据及预填规则进行纳税申报表预填,生成申报表数据。申报表数据通过申报业务规则校验后,经纳税人确认即完成申报表填报业务。

记录点滴 344

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1407

在MFC类中各种类的指针的获取和应用 (2)

 关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特    别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!    1:  因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).  下面所说的是关于单文档的.    例子: 在CMainFrame框架中如何得

VC++/MFC的专栏 2326

Echarts - 去掉图表上的横线和竖线

效果图 默认效果: 变为如下图所示效果: 实现方法 官方配置文档:https://echarts.apache.org/zh/option.html#radar.splitLine 在 xAxis yAxis 配置中分别加入以下代码: splitLine: { show:false }

🏆 前端领域优质创作者 1万+

如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用?

例如:我在CMainFrame 中写代码,要访问CVIEW类中的数据,该怎么写代码?在CMainFrame 中,要访问CDOC类中的数据,该怎么写代码?CVIEW类要访问CDOC类中的数据,该怎么写代码? 假设你是单文档单个VIEW的程序。那么:1)CMainFrame:      GetActiveView()可得到View指针。例如: CyourView   *pView=(CyourView

没有根柢盘深,怎有枝叶峻茂 6301

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

jimonanhai1的专栏 1193

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

曾经沧海 1016

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

无名剑 1665

[MFC]CView视图类、CMainFrame主框架类

1. 视图对象简介以及视图对象何如使用文档来操作数据:     1) 视图的两个重要用途:          i. 鉴于文档的唯一任务就是管理应用程序的数据,那么视图的一个重要用途就是提供文档的可视化表示;          ii. 其次就是将用户输入(鼠标、键盘)转换为操作文档数据的命令,这样文档和视图就紧密联系在一起了,实现了信息的双向传递;     2) 一个文档可以具有与之联系的多

Lirx_Tech的专栏 4213

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

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

9922

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

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

3599

mfc 视图类、框架类、文档类、应用程序类之间的通信机制

<br />视图类要和文档类交换数据,通过在视图类中调用成员函数GetDocument()取得文档类指针。 <br />然后用它操作文档类。<br />视图对象是用来显示文档对象的内容,函数GetDocument()用于获取当前文档对象的指针m_pDocument.而函数OnDraw()是一个虚函数,负责文档对象的数据在用户视图区的显示输出。在向导生成的成员函数OnDraw()中调用了函数GetDocument().通过获取的文档类指针可 以在视图中显示文档内容。<br /><br /><br />1) 在

xiaoxixi1020的专栏 3315

MFC-文档视图

MDI程序       MiniDraw只有一个About对话框,这回要把它变成一个MDI程序,借助于文档视图的威力,并不需要花很大的力气。       MDI由4个类组成:主框架类,由CMDIFrameWnd派生而来,表示程序的MDI父窗口。子框架类,由CMDIChildWnd派生而来,表示程序的MDI子窗口。视图类,由CView派生而来,表示一个文档视图,内嵌于子窗口。

colin 8555

MFC中获取常见类句柄(视图类,文档类,框架类,应用程序类)

MFC中获取常见类句柄<视图类,文档类,框架类,应用程序类> 本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法: GET App AfxGetInstanceHandle() AfxGetApp() GET Frame->View->Document SDI AfxGetMainWnd() ->...

qq_34911636的博客 528

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

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

529
上一篇: 【MFC】利用双缓冲技术解决屏闪问题
下一篇: 【MFC】关于mfc中的Clist
cmdhack
博客等级 码龄19年 20粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值