MFC中CMainFrame类CDoc类CView类CApp类之间关系

用APPWIZARD这个工具声称的应用程序架构包括了应用程序基本的四个类,

分别是:CApp,CMainFrame,CDoc,CView。

其中 CApp负责整个应用程序的管理,CDOC类中有一个CAPP的指针,也可以认为应用程序是从CApp开始执行的。

CMainFrame是主窗口框架

CDoc是应用程序数据来源(文档)主要是用来管理数据,提供保存和加载数据的功能。有关文件的读写操作在CDoc的Serialize函数中进行。

CView是应用程序数据显示(视图)主要是用来数据显示,以及给用户提供对数据的编辑和修改功能。有关数据或图形的显示操作在CView的OnDraw函数中进行。

基本的应用程序就是由这四个类构成的。用户需要做的就是对这些类实例化,以实现所需要的具体功能。

在SDI(单文档)界面中,菜单响应遵循这样一个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函数,而是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调用CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调用CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没有,返回到CApp类中寻找。如果在CApp类中也没有找到,表示没有该菜单的响应函数。

可以这样来理解,菜单消息响应函数的顺序是:CView>CDoc>CMainFrame>CApp

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

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

时间: 2024-11-10 22:10:06

MFC中CMainFrame类CDoc类CView类CApp类之间关系的相关文章

MFC中用户自定义类响应自定义消息

这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义类中响应Windows消息,在本文中都简略叙述.但是,网上大部分的文章没用透彻阐述如何在用户自定义类中响应自定义消息这一通用方法. 问题定义如下:用户自定义一个类,这个类不一定要有界面(完全可以是不可视的),要求自定义的类可以响应某个自定义消息. 首先能够响应消息的类必须都从CCmdTarget类中

高级列表控件ListCtrl关联的MFC中的类:CListCtrl

高级列表控件ListCtrl关联的MFC中的类:CListCtrl■ 报表样式ListCtrl常用操作:1.添加列标题头:InsertColumn2.获取与设置列宽:GetColumnWidth.SetColumnWidth3.添加一行:InsertItem.SetItemText4.获取与设置单元文本:GetItemText.SetItemText5.允许多行选中时,获取选中的行数:GetSelectedCount6.单行选中时,获取选中的行:GetSelectionMark7.选中某行:Se

MFC中文件对话框类CFileDialog详解及文件过滤器说明

当前位置?:?首页???文章分类?:? 开发 ??? MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为图表生成目录 域名迁移公告 2017年12月20日起,本博客迁移到新域名madaimeng.com,旧域名masikkk.com不再更新内容,但将永久保持可访问! 阅读 大专栏  MFC中文件对话框类CFileDialog详解及文件过滤器说明busuanzi_value_page_pv"> 评

MFC中GDI之CRgn类

CRgn类(区域)新建对话框类,修改OnPaint(), void CCRgnDlg::OnPaint() { CPaintDC dc(this); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAP bm; bmp.GetBitmap(&bm); int cx = bm.bmWidth; int cy = bm.bmHeight; CDC mdc; mdc.CreateCompatibleDC(&dc); mdc.SelectObject(&

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J

MFC串口的编程 mscomm控件与SerialPort类

MFC制作上位机,首先需要了解的是串口的编程,一般有两种方法,一个是使用ActiveX控件,例如mscomm串口控件,还有一个是用SerialPort类或者一些其他的串口类,这两个的区别是使用SerialPort类不需要注册控件,在其他没有安装控件的电脑上也能够用. 一·使用mscomm串口控件 使用mscomm串口控件的方法网上一大堆,大致说一些方法和一些需要注意的地方.如果是使用VC6.0在WIN7上来编写就会有个问题会通常说添加控件的方法为选中项目à“工程”à“添加到工程”à“Compon

【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++6.0

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

千兆网络中——使用五类线、超五类线和六类线的区别

去年入手了一台Seagate的Central.一直没时间好好研究,直接插上就用了.内网速度一直维持在10M-15M左右.今年618换了款千兆路由器,速度瞬间提升到了50M-70M.线缆用的都是五类,心中就产生疑问:如果换成超五类线或者六类线,性能是不是能再提高点??于是网上搜到一个哥们十分专业的回答,忍不住粘下来跟大家共享: 原帖地址:http://we.poppur.com/thread-1098485-1-1.html 5类线的传输频率标准是100MHz  超5一般是125MHz  6类标准