MFC单文档多视图分割
MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针

文档模板 GetDocTemplate
CView 对象 文档对象 GetDocument
边框窗口 GetParentFrame
如何在OnDraw函数或***Dlg函数中获得View类的指针(this)或整个对话框的指针?
在单文档中你可以采用如下方法:
现在要获得指针的文件开始处包含两个文件:
视图的主框架类头文件,即#include "MainFrm.h"
视图类头文件,即#include "XXView.h"
在CDocument类中,调用GetFirstViewPosition()和GetNextView()得到所有的view。
在其它类中,一种方法先是把指针传进去,以备调用的时候使用。另外就要用AfxGetApp()得到CWinApp,然后再用GetFirstDocTemplatePosition()和GetNextDocTemplate()得到doc template,然后调用GetFirstDocPosition()和GetNextDoc()得到doc。
在文档类中(CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
MFC中怎么在CMainFrame下获得View类的指针
使用GetActiveView()函数
MFC中普通类如何获取view类的指针?
在普通类(Generic class)中怎么得到view类的指针?我试过这样:
然后在要访问m_pSet处添加如下语句
CMainFrame* frm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
对MFC中文档与视图结构的探析

・ ——
”
— ・
”
—・
”
+
-+
“+ n+
“+
+
-+ *+
-+ -+
-+
- +
”+
- +
一+
- +
一+
一 +
要有完善的结束计划 。学生在这节 体育课上 已经 耗费 很多精力 , 这一 时间的精神状态还 比较兴奋。我们要想 办法让学生从兴奋 紧张 的状态慢慢安静下来 , 不管是对 学生的身体 , 还是 即将开始 的下一 节课 , 都是 至关 重要 的 , 以这也是体育教学 中的一个重要环节 。一般我们 所 在一堂课结束 的时候 , 都会让学生 分开站好 , 采取 闭 目 静心的放松方式 , 让学生做深呼吸 , 逐渐放松身心 , 这时 候老师的一种提示就好 比教会学生如何驾驭一条小船 , 学生在体育课 中的大量活动 , 就好 比一 只小船在大海上 经历 了大风大浪 , 让学生静 止 , 就好 比让学 生如何从大 风大浪的海 中行驶到一个风平浪静的港湾 , 享受着一丝 丝安静。又或者学生可以把 自己比作一 只小 马 , 在疯狂 奔跑之后如何休息 , 进而达到放松心情 的 目的。
【 学法指导 】
对MF C中文档 与视 图结构 的探析
杨黎东
( 山学 院 信息学 院 , 保 云南
保山 680 ) 700
摘要 : 文档 一 图结构是MF 视 c的一 大特 色, 它将数据 的管理 和显示隔 离, 具有结构合理 、 扩充性好等优 点, 给
程序开发者带来很 大方便。 文档一 图结构牵扯到许 多类 , 但 视 比较复杂。 本文较深入地从 实用的 角度探讨 了文档和
-
体 育课 的结束部分不 拘泥于传统 的形式 ,只要是 有 益于 身 、 心放 松 的活 动都可 以采用 , 自我 按摩 , 调整 呼吸 , 念放松 , 意 听上 一段优 雅 的音 乐 , 象把 自己置 想 身于优 美的 自然环境 ,享受 大 自然赋予人们 的恩赐等 形式都 可以让学生采用 。让 学生寻找 出最适合 于 自己 的一种 或几种放 松 活动形式 在不 同的情况 下采用 , 有 利于他 们在走 出校 门后 运用 ,可 以让他们在 体育课上 学到的知识运用到生活 中去 。
MFC多文档多视图编程

深入了解MFC中的文挡/视结构李泽宇金刚熊联欢姜军(华中理工大学图象识别与人工智能研究所)Visual C++ 5.0 以其功能强大、用户界面友好而倍受程序员们的青睐。
但是,在当前的Microsoft 基本类库4.2 版本中,大约有将近200 个类,数千个函数,加之Microsoft 公司隐藏了一些技术细节,使得人们深入学习MFC变得十分困难。
MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用、单文档应用(SDI)和多文档应用(MDI)。
前两者的结构较简单,本文不再赘叙。
笔者拟从MFC中的文档/视结构入手,分析一些函数的流程,并解决编制MDI 应用程序过程中的一些常见问题。
(一)、了解文档/视结构MFC应用程序模型历经多年以有了相当大的发展。
有一个时期,它只是个使用应用程序对象和主窗口对象的简单模型。
在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中,在框架窗口的客户区中,该数据被提交显示器。
随着MFC2。
0的问世,一种应用程序结构的新方式----MFC文档/视结构出现了。
在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。
一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:。
应用程序是一个CwinApp派生对象,它充当全部应用程序的容器。
应用程序沿消息映射网络分配消息给它的所有子程序。
框架窗口是一CfrmeWnd派生对象。
文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分。
视窗是Cview派生对象,它与其父框架窗口用户区对齐。
视窗接受用户对应用程序的输入并显示相关联的文档数据。
通常,应用程序数据存在于简单模型中的框架窗口中。
在文档/视方式中,该数据移入称为document 的独立数据对象。
当然,文档不一定是文字,文档是可以表现应用程序使用的数据集的抽象术语。
而用户输入处理及图形输出功能从框架窗口转向视图。
如何在MFC单文档中创建多视图

u 一个文档可以有多个视图,由Document中成员变量CPtrList m_ViewList维护。
u CFrameWnd拥有一个成员变量CView* m_pActiveView指向当前活动的View。
u CView中拥有一个成员变量CDocument* m_pDocument指向该视图相关的Document。
!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) ||
!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) ||
/wang_qingyuan/blog/item/60870400275c5b087bec2cbd.html
深入分析MFC文档视图结构
2008-10-16 19:40
文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过Windows SDK Programming 的学习和经历就直接进行MFC Programming的学习和开发,更是面对一堆的代码不知所措。
静态分割窗口与多视图实例

静态分割窗口与多视图实例所谓多视,是指在同一个框架窗口下同时显示多个视图。
通过运用这种技术,可以在框架的有限的空间内同时提供给用户更大的信息量,并且使得用户界面更加的友好,增强了软件的可操作性。
窗口分割的基本概念按照分割的时机的不同,窗口分割可以分为两类:动态分割和静态分割。
动态分割是指用户可以动态的分割和合并窗口。
动态分割最多可以有2行2列个窗口,并且所有的窗格只能使用同一种视图类。
静态分割是指窗口在创建时,分割窗格窗口的窗格已经创建好了,且窗格的数量和顺序不会改变了,窗格为一个分隔条所分割,用户可以拖动分割条调整相应的窗格的大小。
静态分割窗口最多可以有16行16列的窗格,但是各个窗格可以使用不同的视图类。
无论创建那一种分割,都必须在创建时指定最大的行数和列数,这些值是有CSplitterWnd 对象进行管理。
对于静态分割,必须创建指定数目的所有窗格以填满行和列。
而对于动态分割,第一个窗格将在框架创建CSplitterWnd对象时自动创建。
窗口分割支持类CSplitterWndCSplitterWnd类主要为窗口的风格提供了封装,窗口被分厂各个窗格后,又该类的对象负责管理。
对于windows而言,CSplitterWnd是一个真正的窗口,它完全占据了框架窗口的用户区域,而视图则占据了分割窗口的床片区域。
CSplitterWnd窗口不参与命令传递机制。
使用时,CSplitterWnd对象通常为其父框架窗口CFrameWnd或CMDIChildWnd(MID应用中)对象的内嵌成员。
CSplitterWnd对象创建过程如下。
在父框架窗口中嵌入CSplitterWnd类的对象成员;重载父框架窗口的CFrameWnd::OnCreateClient成员函数;从上一步重载的函数内部调用Create创建动态分割窗口或者调用CreateStatic创建静态的分割窗口。
下面介绍CsplitterWnd类的几个常用的函数创建动态分割窗口函数Create该函数用于动态创建分割窗口,同时将该窗口与类CSplitterWnd相关联,其生声明如下:BOOL Create(CWnd* pParentWnd, int nMaxRows, int MaxCol, SIZE sizeMin, CcreateContext* pContext, DOWRD dwStyle = WS_CHILD |WS_VISIBLE | WS_HSCROLL | WSVSCROLL | SPLS_DYNAMIC_SPLIT,UINT nID=AFX_IDW_PANE_FIRST);各主要参数的含义如下:pParentWnd:分割窗口的父框架窗口的指针nMaxRows和你MaxCols:行与列的最大值,二者均不大于二sizeMin:指定窗格被显示时的最小值。
单文档与多文档解析

使用AppWizard创建 SDI和MDI界面的应 用程序的过程几乎完 全一样 主 要 差 别
在创建SDI界面的应用程序时,不生成 CChildFrame类,CMainFrame类的基类 为CFrameWnd
在创建MDI界面的应用程序时, CMainFrame类的基类为 CMDIFrameWnd
3
视图是文档的不同表现形式,一个*.html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 一个文件这就是一个文档对应两视图
Doc/View框架虽然可以调用成百上千个不 同的类,但是核心类只有五个: CWinApp CDocument CView CDocTemplate CFrameWnd
10
11.2.1 CWinApp 类
CWinApp类代表主程序,CWinApp本身是不可见的,它 负责维护进程的启动、终止、消息循环、命令行参数、 资源管理
视图把数据显示 于计算机屏幕上
视图通过相关联的文档类 的成员函数将经过修改的 数据传递给文档对象
文档对象获得修改过的数据之后,对 其进行必要的修改,最后保存到永久 介质(如磁盘文件)中
用户通过与视图的 交互来查看数据并 对数据进行修改
6
SDI文档/视图应用程序示意图
7
11.1.3 SDI程序中文档、视图对象的创建过程
成员 m_pszAppName M_lpCmdLine M_pMainWnd M_pszExeName M_pszProfileName M_pszRegistrKey LoadCursor LoadIcon 描述 应用程序名 命令行参数 应用程序主窗口指针 可执行文件名 配置INI文件名 配置注册表主键值 加载光标资源 加载图标资源
MFC多文档和单文档视结构

MFC多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建:CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档新建:CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
单文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
基于单文档的(MFC)窗口分割

基于单文档的窗口分割简介部分是对于MFC应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。
不需要的朋友可以从第二部分程序设计开始看起。
目录基于单文档的窗口分割 (1)简介 (3)MFC应用程序类型简介 (3)单文档与多视图 (5)单文档多视图程序设计 (6)Step1:创建单文档的MFC程序 (6)Step2:声明相关的变量。
(6)Step3:重载OnCreateClient()函数,进行窗口的分割 (7)Step4:设置行列初始值 (9)附:代码 (10)简介MFC应用程序类型简介在Microsoft VC++ 6.0中,基于MFC的应用程序一般分为以下几种:多文档界面(MDI)单文档界面(SDI)基于对话框的应用程序。
图1-1 应用程序类型其中单文档又可分为单视图的和多视图的。
图1-2 单文档单视图图1-3 单文档多视图一般情况下,单文档仅需要单视图就够了,如Windows自带的记事本、画图程序等等,但在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。
在MFC的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所有视图的方法(UpdateAllViews)。
1-4 类视图通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视图的主要方法。
单文档与多视图一般地,单文档与多视图有三种情况:1)在多文档界面MDI中,每个视图位于MDI的一个独立子文档框架中,视图对象基于同一个视图类。
用户可以通过“窗口|新窗口”菜单,为同一文档的视图再创建一个窗口,通过新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实现同步,用户修改一个视图的内容,在另外的视图中也自动更新。
MFC框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC视图分割有两种方法,一种动态分割,一种静态分割。
但是动态分割中,对于单文档只能对应于同一个类窗口,这里不适用所以不做过多研究,重点看静态分割的方法。
MFC中封装了CSplitterWnd类可用于视图的分割。
首先在CMainFrame类中添加CSplitterWnd的对象,然后重写CMainFrame 类的OnCreateClient函数,在该函数中进行视图的分割。
在OnCreateCinent函数中,先定义CRect rect,调用函数Getclient(&rect)用来获取主视图窗格的大小,然后调用CSplitterWnd的成员函数CreateStatic 函数来对视图进行分割,函数原型如下,
BOOL CreateStatic(
CWnd* pParentWnd, //父框架视图对象
int nRows, //行数
int nCols, //列数
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //风格,可直接用默认
UINT nID = AFX_IDW_PANE_FIRST //此窗口的子窗口ID。
如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRSH。
);
父框架视图对象为this表示第一次分割,这时只需定义要分割的行数和列数即可。
如果已经产生了第一次分割,需要对子窗口进行再分割,则这时候pParentWnd为第一次用于分割的CSplitterWnd的对象指针,再新定义CSplitterWnd对象用于第二次分割,这时nID是要被分割的窗口ID,
m_wndSplitter1.IdFromRowCol(1, 0)。
在分割完窗口后,对分割完成的视图创建窗格,此时调用CSplitterWnd的CreateView函数,函数原型如下,
virtual BOOL CreateView(
int row, //要被创建的视图行
int col, //要被创建的视图列
CRuntimeClass* pViewClass, // RUNTIME_CLASS(窗格的类名)
SIZE sizeInit, //指定窗格的大小CSize(rect.Width()/3,
rect.Height()/2)
CCreateContext* pContext //pContext
);
窗格的类要事先定义完成。
至此视图分割完成。
但有时候大小不是我们想要的,这时后可以响应WM_SIZE消息的函数OnSize来实时改变窗格的大小,如下图所示。
同时,我们也可以让视图的框架根据屏幕的分辨率自动最大化显示,响应CMainFrame的OnGetMinMaxInfo函数,如下图,同时在PreCreateWindow函数中初始化cs.cx=0,cs.cy=0。