MFC单文档多视图分割
MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针
![MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针](https://img.taocdn.com/s3/m/0f856112a2161479171128be.png)
文档模板 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中文档与视图结构的探析
![对MFC中文档与视图结构的探析](https://img.taocdn.com/s3/m/01ed277427284b73f24250c8.png)
・ ——
”
— ・
”
—・
”
+
-+
“+ n+
“+
+
-+ *+
-+ -+
-+
- +
”+
- +
一+
- +
一+
一 +
要有完善的结束计划 。学生在这节 体育课上 已经 耗费 很多精力 , 这一 时间的精神状态还 比较兴奋。我们要想 办法让学生从兴奋 紧张 的状态慢慢安静下来 , 不管是对 学生的身体 , 还是 即将开始 的下一 节课 , 都是 至关 重要 的 , 以这也是体育教学 中的一个重要环节 。一般我们 所 在一堂课结束 的时候 , 都会让学生 分开站好 , 采取 闭 目 静心的放松方式 , 让学生做深呼吸 , 逐渐放松身心 , 这时 候老师的一种提示就好 比教会学生如何驾驭一条小船 , 学生在体育课 中的大量活动 , 就好 比一 只小船在大海上 经历 了大风大浪 , 让学生静 止 , 就好 比让学 生如何从大 风大浪的海 中行驶到一个风平浪静的港湾 , 享受着一丝 丝安静。又或者学生可以把 自己比作一 只小 马 , 在疯狂 奔跑之后如何休息 , 进而达到放松心情 的 目的。
【 学法指导 】
对MF C中文档 与视 图结构 的探析
杨黎东
( 山学 院 信息学 院 , 保 云南
保山 680 ) 700
摘要 : 文档 一 图结构是MF 视 c的一 大特 色, 它将数据 的管理 和显示隔 离, 具有结构合理 、 扩充性好等优 点, 给
程序开发者带来很 大方便。 文档一 图结构牵扯到许 多类 , 但 视 比较复杂。 本文较深入地从 实用的 角度探讨 了文档和
-
体 育课 的结束部分不 拘泥于传统 的形式 ,只要是 有 益于 身 、 心放 松 的活 动都可 以采用 , 自我 按摩 , 调整 呼吸 , 念放松 , 意 听上 一段优 雅 的音 乐 , 象把 自己置 想 身于优 美的 自然环境 ,享受 大 自然赋予人们 的恩赐等 形式都 可以让学生采用 。让 学生寻找 出最适合 于 自己 的一种 或几种放 松 活动形式 在不 同的情况 下采用 , 有 利于他 们在走 出校 门后 运用 ,可 以让他们在 体育课上 学到的知识运用到生活 中去 。
MFC多文档多视图编程
![MFC多文档多视图编程](https://img.taocdn.com/s3/m/34fa8781e53a580216fcfeed.png)
深入了解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单文档中创建多视图
![如何在MFC单文档中创建多视图](https://img.taocdn.com/s3/m/38fc6b03bed5b9f3f90f1cec.png)
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的学习和开发,更是面对一堆的代码不知所措。
静态分割窗口与多视图实例
![静态分割窗口与多视图实例](https://img.taocdn.com/s3/m/45a44e84bceb19e8b8f6ba70.png)
静态分割窗口与多视图实例所谓多视,是指在同一个框架窗口下同时显示多个视图。
通过运用这种技术,可以在框架的有限的空间内同时提供给用户更大的信息量,并且使得用户界面更加的友好,增强了软件的可操作性。
窗口分割的基本概念按照分割的时机的不同,窗口分割可以分为两类:动态分割和静态分割。
动态分割是指用户可以动态的分割和合并窗口。
动态分割最多可以有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:指定窗格被显示时的最小值。
单文档与多文档解析
![单文档与多文档解析](https://img.taocdn.com/s3/m/3b560e532b160b4e767fcf2d.png)
使用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多文档和单文档视结构](https://img.taocdn.com/s3/m/1f12e81fa6c30c2259019e28.png)
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)窗口分割](https://img.taocdn.com/s3/m/122956cc89eb172ded63b70a.png)
基于单文档的窗口分割简介部分是对于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框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据
![如何在MFC中其他类访问和交换文档Doc类与视图View类的数据](https://img.taocdn.com/s3/m/e174db3bc4da50e2524de518964bcf84b9d52d19.png)
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据在MFC的单文档里,每个类都有获得其他类指针的一套方法每个类都有获得其他类指针的一套方法.现归纳如下.为方便说明,现假设已用app wizard生成了一个SDI应用程序test,包含如下几个类: CT estApp,CTestDoc,CTestView,CMaimFrame 1:从视图类获得文档类指针如前所述,在视图类中需要引用文档类的地方之前,使用如下语句: CTestDoc *pDoc=(CTestDoc *)GetDocument();以后便可使用pDoc指针访问文档类.此处的强制类型转换在test应用程序中并不需要,因为该程序只有一个视图类,并且在InitInstance()重用SDI文档模板进行了装配.你可以在Test.cpp种的InitInstance()方法中看到如下语句:CSingleDocTemplate *pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINRAME,RUNTIME_CLASS(CTe stDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);以及TestView.h中的定义:inline CTestDoc *CTestView::GetDocument(){return (CTestDoc *)m_pDocument;}简而言之,就是说CT estView的GetDocument()函数自然而然的认为CTestDoc是与它"相配"的.当生成了一个具有多个视图类的应用程序时,(如用CSplitterWnd将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
MFC中文档视图框架和文档模板之间的关系 四个类常用的成员函数
![MFC中文档视图框架和文档模板之间的关系 四个类常用的成员函数](https://img.taocdn.com/s3/m/7319141bba1aa8114431d9e6.png)
文档对象:是用来保存数据的。
视图对象:是用来显示和编辑数据的。
应用程序框架:框架是用来管理不同文档显示界面的。
例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。
为什么不用视图?为的是把界面管理独立的拿出来。
文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。
这个工作在在应用程序初始化时完成,如下:[cpp]view plaincopy1.BOOL CMyHtmlApp::InitInstance()2.{3. CSingleDocTemplate* pDocTemplate;4. pDocTemplate = new CSingleDocTemplate(5. IDR_MAINFRAME,6. RUNTIME_CLASS(CMyHtmlDoc),7. RUNTIME_CLASS(CMainFrame), // main SDI frame window8. RUNTIME_CLASS(CMyHtmlView));9. AddDocTemplate(pDocTemplate);10. }单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。
你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。
多文档:就是你可以打开多个文件,和文档类型也无关。
你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。
何时需要文档/视图框架结构?首先你可以不使用文档视图这种框架结构,即便是在MFC中。
你可以在你需要的时候选择使用这种方式。
你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。
哪什么时候需要呢?当你想将你的数据层和界面层分开的时候。
通常我们对数据的操作放在文档类中,例如存取,打开,关闭。
在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新,那么程序会将你对数据所做的改变呈现给你的程序的用户。
MFC单文档工程文档及序列化
![MFC单文档工程文档及序列化](https://img.taocdn.com/s3/m/f6e9d9ee7c1cfad6195fa71f.png)
一、修改文档标题:(以下都是在MFC单文档工程Graphic下)1、单击【文件/新建】菜单项,或者程序启动时,程序会进入到CGraphicDoc类的OnNewDocument函数,该函数是【文件/新建】命令处理的一部分,是由框架调用的一个虚函数,用于建立一个文档。
通过该函数设置程序标题:BOOL CGraphicDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: add reinitialization code here// (SDI documents will reuse this document)SetTitle("MY MFC");//设置程序标题为MY MFC。
return TRUE;}提示:当单击保存时,默认文件名会是设置的文档名。
2、通过IDR_MAINFRAME字符串资源修改文档标题在ResourceView选项卡下->展开String Table文件夹->双击String Table字符串资源->找到ID 为IDR_MAINFRAME的字符串资源->在头两个”\n”间添加文档标题。
符串资源的各个子串。
实际上利用MFC AppWizard生成应用程序框架的第四步,单击【Advanced】按钮也可以修改IDR_MAINFRAME字符串中的子串。
3、OnNewDocument函数的调用过程OnNewDocument函数并不是一个消息响应函数,它只是一个虚函数。
(1)、程序启动时OnNewDocument函数的调用过程,第一次启动程序时,在OpenDocumentFile函数内部创建了文档类对象,同时还创建了框架类对象和视类对象。
这就是MFC提供的文档/视类结构的一个特点:每当有一份文档产生时,总是会产生一个文档类对象、框架类对象和视类对象,它们三位一体来为这份文档服务。
MFC文档与视图深入详解
![MFC文档与视图深入详解](https://img.taocdn.com/s3/m/8eab9d63caaedd3383c4d32b.png)
1.1 MFC 文档视图结构程序结构总揽当我们使用MFC AppWizard 生成一个MFC 程序,选用所有默认的设置(当然也是Multiple Documents ,本文讨论主要基于Multiple Documents ,对于Single Document 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。
),假设你的程序名称为A ,则你会得到CMainFrame 、CChildFrame 、CAboutDlg 、CADoc 、CAView 、CAApp 6 个类(Single Document 仅少一个CChildFrame 类,其余均同)。
这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App )的主要组成:一个App (对应类CAApp )可以包含多个文档模版(CDocTemplate ),但是MFC AppWizard (无论是SDI 还是MDI )都只是默认生成一个。
但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。
这个结构是通过MFC 中CWinApp 的成员变量CDocManager*m_pDocManager 实现的,我们的CAApp 正是继承自MFC 提供的CWinApp 类。
CDocManager 类则拥有一个指针链表CPtrList m_templateList 来维护这些文档模版。
这些文档模版都是在CAApp ::InitInstance ()中通过AddDocTemplate(pDocTemplate) 。
CDocTemplate 拥有3 个成员变量,分别保存着Document 、View 、Frame 的CRuntimeClass 指针,另外持有成员变量m_nIDResource ,用来指定这个Document 显示时候采用的菜单资源。
这4 份数据都在CAApp ::InitInstance ()中CDocTemplate 的构造函数中指定。
基于MVC的软件界面体系结构研究与实现
![基于MVC的软件界面体系结构研究与实现](https://img.taocdn.com/s3/m/4cd1fd0f7cd184254b3535c2.png)
收稿日期:2003-09-08;修返日期:2003-10-28基金项目:国家 863 计划资助项目(2003AA118105)基于MVC 的软件界面体系结构研究与实现*王映辉1,王英杰2,王彦君3,樊宏斌4(1.陕西师范大学计算机学院,陕西西安710062; 2.中国科学院地理科学与资源研究所,北京100101; 3.中国石油测井有限公司长庆事业部,陕西高陵710000; 4.西北大学计算机系,陕西西安710069)摘 要:软件体系结构研究是目前软件工程领域研究的新一轮热潮,是对软件的更高层次抽象。
在分析MVC (Model/Vie w/Controller)模式机理的基础上,给出了基于MVC 的软件界面体系结构及其工作机理。
软件界面体系结构带来了软件设计的灵活性和高度重用性。
最后,以软件界面体系结构为指导,分析了MFC(Mic rosoft Funda ment Cla ss)的文档视图结构,并给出了软件界面体系结构的具体设计和实现。
关键词:软件体系结构;模型/视图/控制器模式;文档;视图中图法分类号:TP311 13 文献标识码:A 文章编号:1001-3695(2004)09-0188-03Study on Architecture of Software Interface Based on MVCWANG Ying-hui 1,WANG Ying-jie 2,WANG Yan-jun 3,FAN Hong-bin 4(1.College o f Com pute r Science ,Shanxi No rmal U nive rsity ,Xi !an Shanxi 710062,China ;2.Institute o f Geosciences &Resource ,Chinese Ac ademy o f Sc ienc e ,Bei jing 100101,China;3.Changqing Departme nt,China Pe troleum Logging Co.,Ltd ,Gaoling Shanxi 710000,China ;4.Dept.o f Com puter Sc ienc e ,No rthwest U ni versity,Xi !an Shanxi 710069,China)A bstract:Study on software archi tecture is a new upsurge in software engineerin g field.Software architecture is a higher level abstract of software.Analysis theory of MVC,then get the architecture of soft ware interface and make clear the theory of archi tecture of software in terface.Archi tecture of software interface bri ng the flexi bility and reusability of software design.At last,analyze the structure of docu ment/view of MFC,then demon strate implementation of MVC-oriented archi tecture of software i nterface based MFC.Key w ords:Software Architecture(SA);Model/View/Controller(MVC)Pattern;Docu ment;View1 引言软件体系结构(Software Architecture,SA)是目前软件工程领域的一个研究热点[1~3,10,11]。
CSplitterWnd轻松实现单文档拆分视图
![CSplitterWnd轻松实现单文档拆分视图](https://img.taocdn.com/s3/m/383a16f10875f46527d3240c844769eae009a39c.png)
CSplitterWnd轻松实现单文档拆分视图CSplitterWnd 轻松实现单文档拆分视图2009-04-16 下午 6:41该部分主要介绍一些基本概念和创建拆分视图的一般过程。
MFC支持两种类型的拆分窗口:静态的和动态的。
这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。
静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。
但是用户可以缩放各行各列。
一个静态拆分窗口最多可以包含16行16列。
要找一个使用了静态拆分窗口的应用程序,只要看一下windows管理器即可。
动态拆分窗口最多可以有两行两列,但它们可以相互拆分和合并。
Vc就使用了动态拆分窗口使得可以同时编辑源程序文件的两个以上不同的部分。
选择静态或动态拆分的一个准则是是否希望用户能够交互地修改拆分窗口的行列配置。
另一个决定因素是计划在拆分窗口中使用的视图种类。
在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。
但是在动态拆分窗口中,MFC管理着视图,除非从CsplitterWnd派生一个新类并修改拆分窗口的默认操作性能,否则拆分窗口中的所有视图使用的都是相同的视图类。
静态拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create创建,并且由于MFC不会自动创建静态拆分窗口中显示的视图,所以您要亲自在CreateStatic返回之后创建视图。
CsplitterWnd为此提供了名为CreateView的函数。
给框架窗口添加静态拆分视图的过程如下:给框架窗口类添加一个CsplitterWnd数据成员。
覆盖框架窗口的OnCreateClient函数,并调用CsplitterWnd::CreateStatic来创建静态拆分视图。
使用CsplitterWnd:: CreateView在每个静态拆分窗口的窗格中创建视图。
使用静态拆分窗口的一个优点是由于您自己给窗格添加视图,所以可以控制放入视图的种类。
单文档实现多视图
![单文档实现多视图](https://img.taocdn.com/s3/m/c58b6c26bcd126fff7050b0d.png)
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
void CMultiViewApp::OnShowFirstview()
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd,GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
MFC学习总结 (67个技巧) dlg 上建立View
![MFC学习总结 (67个技巧) dlg 上建立View](https://img.taocdn.com/s3/m/d6f7ddfbfab069dc5022019f.png)
MFC学习总结(67个技巧) dlg 上建立View1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);属性页的添加完成。
如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align 项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class 里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120); ""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar,ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。
MFC单文档实现多视图
![MFC单文档实现多视图](https://img.taocdn.com/s3/m/b871f33da32d7375a417805e.png)
一.介绍:多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式:1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。
2)通过一个文档关联多个视图,窗口显示整个视图。
第二种实现较第一种复杂,这里给出详细的实现方法。
二.实现步骤:Step 1:使用VC 6.0新建一个Project,命名为:MultiView。
除选择单文档属性外,一切使用“默认”方式。
于是你可以获得五个类:CMainFrame ,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。
类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument 的实现:CMultiViewDoc* CAnotherView::GetDocument(){return (CMultiViewDoc*)m_pDocument;}Step 3:在CMultiViewApp添加成员变量记录这两个视图:private:CView* m_pFirstView;CView* m_pAnotherView;给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数:voidCMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview()Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码://创建一个新的视图CView* m_pActiveView =((CFrameWnd*)m_pMainWnd)->GetActiveView();m_pFirstView = m_pActiveView;m_pAnotherView = new CAnotherView();//文档和视图关联CDocument* m_pDoc =((CFrameWnd*)m_pMainWnd)->GetActiveDocument();CCreateContext context;context.m_pCurrentDoc = m_pDoc;//创建视图UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1;CRect rect;m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,m _IDFORANOTHERVIEW,&context);Step 5:现在已经创建了视图,并且都和文档关联起来了。
第9章 单文档界面和多文档界面1
![第9章 单文档界面和多文档界面1](https://img.taocdn.com/s3/m/fb9b7ff8700abb68a982fb9b.png)
2011-12-1
2
9.1 文档对象和视图对象
文档和视图的关系
文档用于数据处理和维护, 视图则用于数 文档用于数据处理和维护,而视图则用于数 数据处理 据的显示 在文档/视图结构的应用程序编程中 显示, 视图结构的应用程序编程中, 据的显示,在文档 视图结构的应用程序编程中, 主要的工作就是用代码操作文档对象 视图对象。 操作文档对象与 主要的工作就是用代码操作文档对象与视图对象。 在关于文档对象与视图对象的代码中一般要 调用方法Cview::GetDocument(),通过 调用方法 , GetDocument()可以返回指向联系的视图对象, 可以返回指向联系的视图对象 可以返回指向联系的视图对象, 一般地,当视图为人机交互界面时, 一般地,当视图为人机交互界面时,如果用户在 视图中对文档数据进行编辑, 视图中对文档数据进行编辑,视图将接收到此消 再发送消息通知文档对象更新文档数据, 息,再发送消息通知文档对象更新文档数据,这 时可用GetDocument()得到被操作的文档对象。 得到被操作的文档对象。 时可用 得到被操作的文档对象
2011-12-1
பைடு நூலகம்
5
习题
1.MFC中文档和视图的关系是什么? . 中文档和视图的关系是什么? 中文档和视图的关系是什么 2.文档的主要作用是什么? .文档的主要作用是什么? 3.视图的主要作用是什么? .视图的主要作用是什么?
2011-12-1
6
第9章 单文档界面和多文档界面 章
内 容 提 要
1
文档对象和视图对象
2
单文档界面
3
多文档界面
2011-12-1
1
9.1 文档对象和视图对象
文档对象:文档对象用于存储程序数据, 文档对象 文档对象用于存储程序数据,在 文档对象用于存储程序数据 应用程序中,要使数据存放到文档对象中, 应用程序中,要使数据存放到文档对象中, 就应将存储的数据作为文档对象的成员变 的文档类由Cdocument类所派生。 量。MFC的文档类由 的文档类由 类所派生。 视图对象:显示文档数据以及接受用户的输 视图对象 显示文档数据以及接受用户的输 入和编辑, 入和编辑,视图对象的一个非常重要的成 函数, 员函数是OnDraw()函数,每当窗口需要重 员函数是 函数 画时就将调用此函数, 画时就将调用此函数,MFC的视图类由 的视图类由 Cview类所派生。 类所派生。 类所派生
OpenCASCADE6.7.0创建单文档多视图
![OpenCASCADE6.7.0创建单文档多视图](https://img.taocdn.com/s3/m/288c9d79a417866fb84a8eab.png)
pDocTemplate2D = new CMultiDocTemplate(IDR_MyViewerTYPE, RUNTIME_CLASS(CMyViewerDoc), RUNTIME_CLASS(/*CChildFrame*/CChildFrm2D),
if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_3dCHILDFRAME)) {
改成下面的形式
#include "OCC_BaseChildFrame.h"
class CChildFrame : public /*CMDIChildWnd*/OCC_BaseChildFrame {
20. 对 MyViewerView.h 做如下修改
#include "OCC_3dView.h"
20. 添加两个类,通过右键单击→【类向导】,来添加两个类,方法如下图。
将这两个类的代码修改成如下的形式。 新添加的 View 类修改成下面的形式:
#include "OCC_2dView.h"
class CMyViewerView2D : public /*CView*/OCC_2dView {
10. 下面将设置工程的属性,可以通过在工程上单击右键,选属性,弹出属性页对话框, 在对话框中进行设置。首先修改包含目录,如下图所示,
11. 添加 WNT
12. 添加 lib 库
lib 库如下: TKBRep.lib FWOSPlugin.lib PTKernel.lib TKBool.lib TKCAF.lib TKCDF.lib TKernel.lib TKFeat.lib TKFillet.lib TKG2d.lib TKG3d.lib TKGeomAlgo.lib TKGeomBase.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV3d.lib TKOpenGl.lib mfcsample.lib
- 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。