一种基于MFC的GIS多文档多视图技术实现
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的学习和开发,更是面对一堆的代码不知所措。
第12章 MFC CRgn区域类与GIS的空间分析算法

参数: pRgn1 表示一个已经存在的区域。 pRgn2 表示一个已经存在的区域。 nCombineMode 指定当组合两个源区域时要执行的操作。它可以是下列值之一: · RGN_AND 使用两个区域互相重叠的区域(相交区域)。 · RGN_COPY 创建区域1(由pRgn1标识)的一个拷贝 · RGN_DIEF 创建一个区域,该区域由区域1(由pRgn1标识)的不是区域2(由pRgn2标识) 的那一部分区域组成。 · RGN_OR 组合两个区域的整个部分(两个区域的并)。 · RGN_XOR 组合两个区域,但去掉相互重叠的区域。
12.1.3 CRgn创建 (4)多边形
BOOL CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode ); 参数: lpPoints 指向一个POINT结构数组,或指向一个 CPoint对象数组。每一个结构指定多边形的一个顶点的x坐 标和y坐标。 nCount 指定由lpPoints指向的数组中的POINT结构或 CPoint对象的数目。 nMode 指定区域的填充模式。这个参数可以是 ALTERNATE或WINDING。
12.5 CRgn的保存
2、 CRgn 转换成 RGNDATA
RGNDATA* DTIS_RgnToData( CRgn* pRgn, long& nCount ) { nCount = pRgn->GetRegionData(NULL,1); if( nCount==0 ) return FALSE; RGNDATA* pRgnData = (RGNDATA*)(new char[nCount]); pRgn->GetRegionData( pRgnData, nCount ); return pRgnData; }
MFC的窗口分割实例以及CSplitterWnd类

3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。
三维GIS开发工具VC-MFC在Windows应用程序中的封装

信 息科学 Jj l
三维 G s I 开发工具 VC MF - C在 Wid ws n o 应用程序中的封装
徐 磊
( 浙江师范大学旅 游与资源管理学院。 浙江 金 华 3 10 பைடு நூலகம் 2 0 4
摘 要: 微软 的 MF Mirsf F I】 o 是一套面向对象的应 用程序框架, C( coot ol出d n da l 它封装 了 Wi3 DK 中的 AP 接 口。vc+ n2S I +及 MF C是进
行三维 GS I开发的重要 工具 。以一个基于 MF C的单文档应 用程序 为例, 剖析 MF C的封装过程 , 点是程序 的初 始化和窗 口 建, 重 创 显示, 更新过程 中的封 装细节, 为读者揭示 MF C的封装机制。
关键词 : C; MF 封装 ; n 2A I应用程序框架 Wi P ; 3
1 概述 下 文件 WI MA NC P: N I .P ) cs hl om n 函数内部, e SeCm ad s l 可以看到其中有如 m X P x n i H N T n B NT M C F 是微软公司提供的一整套应用程序框 i AF A IAfWiMan {I S ANCE hl蛐 c HI S ANCE 下代码( M C 参见 F 源文件 A P ICD: P UZ P h Pmrn tn e ls e, a B O C n px r esh l o m n CC m n Ln l o O L W/ lPc s e C m a d A : m S [ o mad i n & ef 架, 它利用 c + + 语言全面封装 了微软的 Wi o s n w d L I T l m Ln, a n md hw P S R p d i ̄ h C S o) C t d AI P 接口, 在开发 Wi
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据

如何在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将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
第2章_ArcGIS组件式开发

4、成本低。 、成本低。
组件的重用率极高。 组件的重用率极高。同一个组件可以在不同的软件中 重复使用。 重复使用。
GIS设计与开发 GIS设计与开发 8
常用组件式GIS软件简介 常用组件式GIS软件简介
全球最大的GIS厂商 厂商ESRI(美国环境研究所 公司: 美国环境研究所)公司 全球最大的 厂商 美国环境研究所 公司:
GIS设计与开发 GIS设计与开发 17
MapX 公司1996年10月开始推出的基于 月开始推出的基于ActiveX技术 是MapInfo公司 公司 年 月开始推出的基于 技术 可编程的控件MapInfo MapX。 可编程的控件 。 是一个基于ActiveX(OCX)技术的可编程控件。它使用与 技术的可编程控件。 是一个基于 技术的可编程控件 MapInfo Professional一致的地图数据格式,并可实现 一致的地图数据格式, 一致的地图数据格式 大多数的MapInfo Professional的功能。 的功能。 大多数的 的功能 提供了四十多个父类( 基础类(MFC)的OLE 提供了四十多个父类(为Microsoft基础类 基础类 的 对象),应用程序员可以使用任何支持ActiveX的程序开 ),应用程序员可以使用任何支持 对象),应用程序员可以使用任何支持 的程序开 发环境, 发环境,如VisualC++、、Delphi、 、 、 、 Power-Builder等嵌入 等嵌入MapX控件开发 控件开发GIS应用程序。 应用程序。 等嵌入 控件开发 应用程序
GIS设计与开发 GIS设计与开发 16
TITAN(泰坦) TITAN(泰坦)
提供一组TITAN ActiveX控件; 控件; 提供一组 控件 应用程序员可以在标准的程序设计环境 (如Visual ,Visual , C++,Power Builder、Visual FoxPro和 、 和 Delphi等)中将 等 中将TITAN GIS的强大功能嵌 的强大功能嵌 入到应用程序中,开发嵌入式GIS应用系统。 应用系统。 入到应用程序中,开发嵌入式 应用系统
MapWinGIS应用于GIS程序设计实践

MapWinGIS应用于GIS程序设计实践吕秀琴;张毅【摘要】介绍了开源GIS平台的功能特点,通过比较各种开源GIS平台特点,选择基于MapWinGIS进行GIS程序设计,包括程序框架建立、矢量与栅格数据类型支持、访问方式和基本功能操作.利用实例说明了MapWinGIS程序开发便捷、开放的特点,有助于GIS软件程序的升级、维护和扩展.%This paper introduces the function features of Open Source GIS platform. MapWinGIS is selected for GIS programming by comparing several Open Source GIS platforms. It includes procedural framework establishment, the supported types and accessing methods of vector and raster data, and basic operation functions. The convenient and open characteristics of MapWinGIS programming, helping upgrade, maintenance and expansion for GIS programming are explained by examples.【期刊名称】《实验技术与管理》【年(卷),期】2012(029)010【总页数】4页(P110-113)【关键词】程序设计;开源GIS;MapWinGIS;接口对象;矢量数据;栅格数据【作者】吕秀琴;张毅【作者单位】武汉大学资源与环境科学学院,湖北武汉 430079;武汉大学测绘学院,湖北武汉 430079【正文语种】中文【中图分类】TP31Abstract:This paper introduces the function features of Open Source GIS platform.MapWinGIS is selected for GIS programming by comparing several Open Source GIS platforms.It includes procedural framework establishment,the supported types and accessing methods of vector and raster data,and basic operation functions.The convenient and open characteristics of MapWinGIS programming,helping upgrade,maintenance and expansion for GIS programming are explained by examples.Key words:programming;open source GIS;MapWinGIS;interface object;vector data;raster data本文介绍了MapWinGIS应用于GIS程序设计的实践过程,包括程序框架的建立、数据类型及其访问方式和基本功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第32卷第6期2005年11月浙 江 大 学 学 报(理学版)Journal of Zhejiang U niversity(Science Edition)http :///sciVol.32No.6Nov.2005收稿日期:2004204230.基金项目:国家863资助项目(2001AA61303021).作者简介:郭宪杰(1979—)男,硕士研究生,主要从事地理信息系统的设计与应用、遥感数字图像处理等研究.一种基于MFC 的GIS 多文档多视图技术实现郭宪杰,张 微,章孝灿,黄智才(浙江大学地球科学系空间信息技术研究所,浙江杭州310027)摘 要:针对GIS 中数据分析与管理的多图层需要,在深入研究MFC 类库框架结构、分析Windows 应用程序开发流程的基础上提出了一种基于MFC 的多文档多视图框架结构的解决方案,该方案不仅与MFC 有着良好的继承、扩展和兼容性,可以快速地实现应用程序开发,而且又很好地实现了GIS 中图层管理的多文档多视图特点,满足了多源数据分析与管理的要求,实践表明这是一种可行的技术方案.关 键 词:地理信息系统;多文档多视图;图层中图分类号:TP391.41 文献标识码:A 文章编号:1008-9497(2005)06-711-05GUO Xian 2jie ,ZHAN G Wei ,ZHAN G Xiao 2can ,HUAN G Zhi 2cai (Department of Earth S ciences ,S patial I nf or 2mation Technolog y I nstitute ,Zhej iang Universit y ,H angz hou 310027,China )R elization of Malti 2Doc/Malti 2View in GIS b ased on MFC.Journal of Zhejiang University (Science Edition ),2005,32(6):711~715Abstract :In view of the demand of multi 2layer with data analysis ,processing and management in GIS ,by making a thorough research in MFC classes framework and analysing the routine of windows application ,a solution is put for 2word with Multi 2Doc/Multi 2View structure based on MFC.the practice shows that this solution can not only work with MFC fluently but also solve the problem in GIS.It ’s proved that this is a feasible solution.K ey w ords :GIS ;multi 2doc/multi 2view ;layer0 引 言地理信息系统(Geograp hic Information Sys 2tem ,以下简称GIS )是一种采集、存储、管理、分析和输出空间信息的计算机技术系统[1].据美国著名的GIS 专家J ack Dangermond 研究,世界上有80%以上的信息属于空间信息,全球空间信息资源总价值超过1000亿美元[2].GIS 已经成为信息高速公路的重要组成部分,也是完成数字地球的核心支撑技术之一[3],因此GIS 技术得到世界各国的重视并投入大量人力物力进行研究和开发.为实现GIS 系统的快速开发,必须选用一种高效的开发工具来提高开发效率.在目前流行的图形用户界面Windows 平台上有各种开发工具,由于Visual C ++与Windows 操作系统结合最为紧密,并且因其提供的M FC 类库具有功能强大、开发效率高等优点而被广泛应用.M FC (Microsoft Foun 2dation Class 微软基础类库)是由一组相互关联相互支持的类构建的应用程序模型,它采用面向对象的思想用C ++语言封装了Windows 平台的A PI 函数,使得应用程序开发可以在继承前人工作的基础上开发各自所需的应用需要,提高开发效率,加快开发进度,增加应用程序的可靠性和可维护性[4].M FC 应用程序模型中文档/视图结构的出现,不仅丰富了原有的应用程序对象和主窗口对象的简单模型,而且实现了数据存储和表达的分离,更加适合大型软件的开发[5].虽然M FC 在文档/视图结构中提供了多文档模板可以操作不同类型的文档数据,但是其本质仍然是一种单文档多视图的结构,即一份文档数据虽然可以在应用程序的多个视图中显现,但在一个视图中却只能表达一份文档数据.这种结构应用到GIS中的图层管理就遇到了困难.因为GIS系统本身是把各种类型的空间数据进行分层存储与管理的,在分析应用时则需要把多层数据进行叠置展现在同一视图中,因此图层管理是GIS系统的基本需要,多文档多视图结构是GIS的内在要求.有的作者提出“多文档多视图”同名的概念[6],但他的实现方法仅是在M FC多文档模板的基础上采用窗口分割技术实现多视图的,最后在一个视图中展现的仍然只是一个文档对象,而GIS中的图层管理要求在一个视图中表达多份文档数据,一份文档数据可以从不同的视图中显现.因此文献[6]中的方法与GIS应用中的多文档多视图要求是完全不同的.本文通过对M FC的单文档/多视图结构和GIS 图层管理中的多文档/多视图需求的深入研究,提出了一种通过改进M FC的单文档/多视图结构来实现GIS图层管理多文档/多视图结构的方案,该方案既充分利用了M FC强大的功能,又避免了其自身的缺点.通过笔者的具体实现证明该方法是切实有效的.1 GIS图层管理的多文档多视图结构由于GIS所管理的空间信息量较大,为了更好地组织、管理和使用各种类别地物的空间信息,针对一个工作区,通常是按照地物类别划分为若干图层来存储与管理空间信息的.这样可以采用相同的分析模型对同一图层进行数据分析并获取所需的信息,而进行综合分析时再把各个相关的图层进行叠置融合分析.这样,在数据采集时按不同的地物类别进行分层,每一图层都单独表达地理空间中的某一特征,多个图层则可以从多个方面来表示各种地理特征,更直观的就是把多个图层叠置在一起共同反映该地理空间的总体特性.图层概念的引入为解决海量空间数据的组织和管理提供了一种有效的方法,图层管理已经成为GIS应用开发的关键技术之一.图1为笔者实验所实现的多文档多视图结构的结果示意图.图中表达的是某一地理空间中的3个相关地理要素的图层信息:区划边界图、河流水系图和规划高速公路图.视图Ⅱ内是区划边界图,视图Ⅲ内是河流水系图,视图Ⅳ内是规划高速公路图,视图Ⅰ内则是综合其他3个子视图的地理信息.图1 GIS中多文档多视图结构示意图Fig.1 Multi2doc/multi2view structure in GIS可以从图1中的Ⅱ~Ⅳ视图的单个图层获得相应的地理信息.比如可以根据Ⅱ中的区划边界图计算各个行政区域的面积,了解相互之间的空间邻接关系;根据Ⅲ中的河流水系图可以计算该区域的水网密度;根据Ⅳ中的规划高速公路图可以计算交通路线长度等.但是从任何单个图层都只能获得有限的信息,它受限于原始数据的采集而不能衍生出更多的信息,而在叠加了区划边界、河流水系和规划高速公路的地图中则可以进行数据挖掘分析获得更多的信息,比如可以通过建立分析模型获得每一个行政区域内的交通运营能力,判断在该区域内增设交通路线是否必要且合理,在河流存在的地方架设高速公路是否增加了修建成本等.这样的衍生信息都是需要多个图层叠置综合分析才能获得的.图2 GIS中多文档多视图结构说明图Fig.2 Illuminate for multi2doc/multi2view structer in GIS GIS中的图层管理是基于多文档多视图结构的(以下论述中的文档即是GIS图层,两者为同一概念,不详加区分),多文档的含义是指在同一个视图内可以同时表达多个不同的数据文档,多视图的含义则是指同一个数据文件可以在多个视图内同步表达出来.图2为图1的多文档多视图结构的说明图,多文档模式即为子视图Ⅰ所示,它可以同时表达三个图层数据;多视模式即为图层一的表达模式(图层二、三亦如此),它的文档数据在子视图Ⅰ和子视图Ⅱ中都有表达,数据更新时会在各个相关视图中同步表现出来.217浙江大学学报(理学版) 第32卷 2 基于MFC 的GIS 多文档多视图框架结构设计2.1 MFC 的文档/视图结构M FC 的文档/视图结构是M FC 应用程序框架的核心技术和重要支撑,它的基本思想就是将数据的操作和数据的表达分开处理.文档对象是应用程序数据集的抽象,用于管理应用程序中的数据,所有对数据的定义和操作均在文档对象中实现;视图对象则是数据的用户窗口,它将文档中的数据在用户窗口中表达出来并提供与文档中数据进行交互的用户界面,表达数据并响应用户在视中操作.这种文档/视图结构使得模块划分更加合理,独立性更强,在开发大型软件项目时更加适用[5].基于MFC 文档/视图结构的应用程序主要有两种模式:单文档应用程序(SDI )和多文档应用程序(MDI ),MDI 相比较SDI 来说,它可以同时打开多个文档数据并支持同时在多个子窗口中进行操作,这种应用程序的模式满足GIS 的实际要求,作为本文的主要研究内容.图3 MFC 文档视结构示意图Fig.3 Doc/view structure in MFC图3为MDI 应用程序的MFC 文档/视图结构框架示意图.由图3可知,基于M FC 的应用程序通过文档管理对象的成员m_templateList 来管理打开的多种文档类型,又通过多文档模板对象的成员m_docList 打开同一文档类型的多个文档对象;但是在MFC 的文档视图类对象中,一个文档对象可以对应多个视图对象m_viewList ,也就是说一份文档数据可以在应用程序的多个窗口中表达;而一个视对象只对应于一个文档对象m_pDocument ,文档与视图的对应仅仅是单文档与多个视图的对应.文档至少有一个相关联的视图,视图只能与一个文档相关联[6].这种结构虽然在许多领域发挥了巨大的作用,但是它在面向GIS 的多源数据分析处理和管理中却存在着严重的不足,因为在GIS 中一个视图中必须可以同时表达多个文档数据才可以满足多源数据分析的内在要求.2.2 基于MFC 的多文档多视图结构设计MFC 框架结构设计的本意是让用户只需对最关心的用户交互对象———文档和视图进行操作,窗口的各种操作都被MFC 所封装而无需过细地干预,这样可以使用户从界面的编写中解放出来,而把主要精力放在具体任务的完成上.本文的目的就是通过继承并改造MFC 已有的强大且高效的功能,而达到多文档多视图的目的,并不改变原有MFC 的使用风格,使用户仍只需专注于任务的完成.由于M FC 的多文档模板类CMulti Template 在文档/视图结构中起到联络枢纽的作用,应用程序通过它来打开文档数据、创建窗口和视对象,并进行多文档的管理.因此,本文提出了通过继承并扩展CMulti Template 类来实现GIS 的多文档多视图功能的方案,鉴于视图类和文档类都与模板类之间存在较为紧密的联系,故本文同时扩展相应的文档类和视图类,具体实现是对图3中的虚线框部分进行了继承和扩展,改进后的框架如图4所示.图4 基于MFC 的多文档多视图结构示意图Fig.4 Multi 2doc/multi 2view structurein GIS based on MFC●C GISTemplate 类是完成多文档多视图功能的核心类,它是通过继承多文档模板类CMulti 2Template 并重载其对文档和视对象的操作来实现的.为了实现多文档/多视图的管理,在C GISTem 2plate 类中新定义了视链表成员m_gisViewList ;另外,虽然父类CMulti Template 中已有文档链表成员m_docList ,但它仅用来记录所打开的多个文档对象,不能实现GIS 中文档和视的多重对应操作(因其只能实现单文档/多视图功能),因此本文重317 第6期郭宪杰,等:一种基于MFC 的GIS 多文档多视图技术实现新定义了文档链表成员m_gisDocList用来管理当前模板所打开的文档图层.●C GISView类是通过继承视类CView来实现图层数据的用户表示与交互.为了实现视与多文档的关联功能,本文在其内部新定义了文档链表成员m_docList Self,其用于记录当前视窗口所关联的所有文档对象指针.视图更新显示时只需对该视的文档链表进行遍历即可.每个视对象可以通过文档链表成员添加或删除该视对象所关联的文档图层.●C GISDoc类是通过继承文档类CDocument 来实现图层数据的管理.虽然父类CDocument中已有成员m_viewList用来管理与该文档关联的多视,但因其不能满足多文档多视图的关联操作,故本文重新定义视链表成员m_viewList Self来记录当前文档所关联的所有视对象指针,其目的是增强对视链表的管理功能.每个文档可以通过视链表的增删操作实现该文档对象与哪些视窗口关联.3 G IS多文档多视类框架的封装和使用3.1 多文档多视类框架的封装实现所谓多文档多视图结构,就是一个文档可以与多个视图相关联;一个视图可以与多个文档相关联.基于上面的论述,笔者采用Visual C++ 6.0具体封装实现了GIS多文档多视功能的类框架,该类框架主要包括3类:C GISTemplate,C GISDoc和CGISView.多文档多视图的主要工作内容有打开文档、创建视图、关闭文档、消毁视图,同时在上述操作过程中需要对文档和视相互关联.本文设计的多文档多视图结构的实现过程如下:■打开文档 当应用程序打开一个文档图层时,首先指定其所属的视图对象,然后创建文档对象并在其视链表成员m_viewListSelf中填充指定视图的对象指针,其次模板对象CGIST emplate在文档链表成员m_gisDocList中添加该文档对象指针,最后查找该文档对象视链表中的所有视对象,在每个视对象的文档链表m_docListSeft中添加该文档对象.■创建视图 当创建一个视图对象时,首先指定该视对象要表达的文档图层,然后创建视对象并用指定的文档对象指针填充它的文档链表m_doc2 List Seft,其次在C GISTemplate的视图链表m_gis2 ViewList中添加视图对象指针,最后遍历视图的文档链表m_docList Seft查找各个文档对象,在每个文档对象的视图链表m_viewList Self后添加该视图对象指针.如图5所示,欲创建新视图对象来表达Doc1和Doc3的叠加时,先创建视图对象View3,并用Doc1和Doc3的对象指针填充视图对象的m_doc2 List Seft,然后在模板对象CGIST emplate的m_gis2 ViewList中添加该视图对象指针,最后遍历视图的文档链表m_docListSeft在Doc1和Doc3的视图链表中添加View3.即图5虚线所示.打开文档亦与此相同.图5 多文档多视图结构实现原理示意图Fig.5 Relization for multi2doc/multi2view structure in GIS■关闭文档 当关闭一个文档图层的时候,首先在文档的视图链表中查找其对应的所有视图对象,分别移除视图对象文档链表中的该文档指针,然后再在C GISTemplate中移除文档对象指针.■销毁视图 在销毁视图的时候,首先也要根据视图的文档链表遍历所有关联的文档对象,分别移除文档中的视图链表指针,最后再在CGIST em2 plate的视链表m_gisViewList中删除视图对象指针.如图5所示,若要移除View3对象,首先通过其文档链表成员找到Doc1和Doc3,然后再分别在每个文档的视链表中移除该视图对象指针(如Doc3中的View3),最后在模板对象的视图链表中移除View3本身.通过上述设计,C GISTemplate对象管理所有文档和视图对象,所有的数据操作都在文档图层类C GISDoc中完成,所有的用户响应操作都在C GIS2 View视图中完成.这仍然和M FC原有的文档/视图结构模式相一致,而C GISTemplate类对象仅是一个“后台管理者”协调多文档与多视图的关系,用户也不必关心它的具体实现.用户仍然可以像MFC 中的文档/视图结构一样从多个角度对一个文档数据进行观察,完成多视图的功能;同时还可以对一个视图中的任意图层进行添加删除,让多个图层同时在一个视图中表达完成多文档功能,从而实现了GIS的多文档多视图的功能.417浙江大学学报(理学版) 第32卷 3.2 多文档多视框架封装类的使用当用户要创建一个实现GIS多文档多视图功能的工程时,其文档模板可以直接引用或者继承于CGISTemplate模板类,同时用户的文档类和视图类分别继承于已封装的GIS文档类C GISDoc和GIS视图类CGISView,略做修改即可实现GIS多文档多视图功能,这样用户可以很容易地实现多文档多视图的图层管理.下面采用Visual C++6.0工具,以向导创建M FC的MDI应用工程GISTest为例,实例说明如何使用多文档多视图框架封装的类.其实现的具体步骤如下(黑体显示为需要修改的地方):(1)把已封装的GIS的类文件引入到GISTest 工程中去.(2)在头文件中添加类包含文件.(3)把GIST estDoc和GIST estView的父类都分别指定为CGISDoc和CGISView,并把工具生成的代码相应地用到的父类,继承方法也做相应的改变.(4)在C GISTestApp的Init Instance()中做如下代换:CGIST emplate3pDoc Template;//采用GIS2 Template模板来完成GIS的多文档多视图结构.pDoc Template=new CGIST emplate(//原始代码pDoc Template=new CMultiDoc Template (IDR_GISTEST YPE, RUN TIM E_CLASS(CGISTestDoc), RUN TIM E_CLASS(CChildFrame), RUN TIM E_CLASS(CGISTestView));AddDoc Template(pDoc Template);(5)注意在C GISTestView::OnDraw()中操作时调用GetDocument()为视链表中的一个图层,用户若想同时控制多个图层,亦可调用父类提供的文档链表操作的函数.通过上述操作,笔者实现了多文档多视图的简单示意图,包括行政区划图、河流水系图和规划高速公路图(如图1所示).4 结 论本文在深入分析GIS图层管理需求以及M FC 文档/视图结构优缺点的基础上,提出了一种通过改进MFC文档/视图结构来实现GIS多文档/多视图结构的方案,并且对该方案给予了具体的类的封装实现,实践表明该方案具有以下特点:●能充分利用M FC原有类库的强大功能;●没有过多地改变M FC的原有使用风格;●扩展了M FC对多文档多视图结构的支持;●封装类使用简洁方便,仅需微小改动就可以实现GIS的多文档/多视图结构.参考文献(R eferences):[1] 陈述彭,鲁学军,周成虎.地理信息系统导论[M].北京:科学出版社,2001.CH EN Shu2peng,L U Xue2jun,ZHOU Cheng2hu.I n2 troduction to G eographic Inform ation Systems[M].Bei2 jing:Science Press,2001.[2] DAN GERMOND J.The f uture of GIS Technology[A].Proceedings of the20th Asian Conference on R e2mote Sensing[C].Hong K ong:Asian Conference onRemote Sensing,1999.[3] 吴信才.GIS原理与方法[M].北京:电子工业出版社,2002.WU Xin2cai.Principle and Method in GIS[M].Bei2 jing:Publishing House of Electronics Industry,2002.[4] 候俊杰.深入浅出Windows MFC[M].第2版,武汉:华中理工大学出版社,2001.HOU J un2jie.Dissecting Windows MFC[M].2nd,Wu2 han:Publishing House of Huazhong University of Sci2 ence and Technology,2001.[5] 李泽宇,金刚,熊联欢,等.深入了解MFC中的文挡/视结构[J/D]./~maqianli/vc/Document/D_85.htm,2003210.[6] 梦凡.用VC++开发多视图多文档应用程序[J].电脑编程技巧与维护,2003,11:41-42.M EN G Fan.Multi2doc/multi2viwe programming withVC++[J].Computer Programming Skills and Mainte2 nance,2003,11:41-42.[7] 李久进.MFC深入浅出[M].武汉:华中理工大学出版社,1996.L I Jiu2jin.MFC in Dissecting[M].Wuhan:PublishingHouse of Huazhong University of Science and Tech2 nology,1996.[8] DAV ID J,SCO T W,GEOR GE S.Visu al C++6.0技术内幕[M].第5版,北京:希望电子出版社,2002.DA VID J,SCOT W,GEORGE S.I nsid e V isu al C++6.0[M].5th,Beijing:X iwang Electronics Press,2002.[9] 陈建春.Visulal C++开发GIS系统[M].北京:电子工业出版社,2000.CH EN Jian2chun.Developing GIS with Visu al C++[M].Beijing:Publishing House of Electronics Indus2 try,2000.(责任编辑 寿彩丽)517 第6期郭宪杰,等:一种基于MFC的GIS多文档多视图技术实现。