MAPGIS70二次开发教程-入门篇.pdf

返回 相似 举报
MAPGIS70二次开发教程-入门篇.pdf_第1页
第1页 / 共63页
MAPGIS70二次开发教程-入门篇.pdf_第2页
第2页 / 共63页
MAPGIS70二次开发教程-入门篇.pdf_第3页
第3页 / 共63页
MAPGIS70二次开发教程-入门篇.pdf_第4页
第4页 / 共63页
MAPGIS70二次开发教程-入门篇.pdf_第5页
第5页 / 共63页
点击查看更多>>
资源描述:
中地软件系列丛书中地软件系列丛书 MAPGIS70 二次开发教程二次开发教程 入门篇入门篇C版版 中地数码科技有限公司 2006 年 4 月 武汉 MAPGIS 内容提要内容提要 MAPGIS70 二次开发教程- 入门篇 C版是根据最新推出的 MAPGIS70 软件平台编写而成,主要介绍在 VC 环境下进行 MAPGIS70 二次开发必须具备 的基础知识,通过实例程序一步步的带领大家了解和理解 MAPGIS70 二次开发 的开发模式和开发技巧。 本书作为 MAPGIS70 地理信息系统系列产品配套使用手册,供使用 MAPGIS70 地理信息系统进行二次开发的入门用户参考。 版权所有 武汉中地数码科技有限公司 警告 未经武汉中地数码科技有限公司书面许可,任何单位和个人均不得以任 何形式或手段复制或传播本书的任何部分。 前前 言言 在国家“十五”863 项目的支持下,历经 5 年的科技攻关,由中地数码科技有限公司开 发的具有完全自主版权的第一套“分布式超大型 GIS 平台软件 MAPGIS70”已经研制成功。 MAPGIS70 是属于最新的“第四代 GIS”软件产品,具备“纵向多层,横向网格”的分布式体 系结构, 采用 “面向服务” 的最新设计思想, 支持局域和广域网络环境下空间信息网格 (SIG) 的分布式计算, 实现了面向空间实体及其关系的数据组织、 高效海量空间数据的存储与索引、 大尺度多维动态空间信息数据库、三维实体建模和分析,具有 TB 级空间数据处理能力、支 持分布式空间信息分发与共享、网络化空间信息服务,支持 Unix/Linux 大型服务器,支持 海量、分布式的国家空间基础设施建设。 MAPGIS70 二次开发教程-入门篇 C版是根据最新推出的 MAPGIS70 软件平台编 写而成, 主要介绍在 VC 环境下进行 MAPGIS70 二次开发必须具备的基础知识, 通过实例程序 一步步的带领大家了解和理解 MAPGIS70 二次开发的开发模式和开发技巧。 本书共分为两部分 第一部分是基于插件的应用框架开发, 通过实例带领大家完成工具, 视图插件制作的过 程。 第二部分是基于 MFC 类库的应用框架开发,通过实例带领大家完成地图文档的显示编 辑,空间分析功能模块的开发过程。 参加本书编写的人员主要是 MAPGIS70 的软件开发工程师和二次开发技术支持工程师。 由于时间仓促,书中难免存在错误和不当之处,敬请广大用户及读者提出宝贵意见和建议, 以利改进。 中地软件丛书编委会 2006 年 4 月 目 录 MAPGIS70 二次开发环境配置..............................................................1 第一部分 基于插件的应用框架............................................................4 1.1 概述 ...................................................................................................................................4 1.2 主界面中各对象的功能与操作方式................................................................................4 1.3 平台插件组成的应用程序 .............................................................................................5 1.4 创建自己的工具条插件示例教程....................................................................................8 1.4.1 使用 Visual C 6.0 创建 ATL COM AppWizard 工程.......................................8 1.4.2 添加 Atl Object 和工具条资源..............................................................................9 1.4.3 添加实现代码.......................................................................................................13 1.4.4 运行结果...............................................................................................................20 1.5 创建自己的视图插件示例教程......................................................................................22 1.5.1 使用 Visual C 6.0 创建 ATL COM AppWizard 工程.....................................22 1.5.2 添加 Atl Object.....................................................................................................23 1.5.3 添加实现代码.......................................................................................................26 1.5.4 运行结果...............................................................................................................32 第二部分 基于 MFC 的应用框架........................................................35 2.1 地图文档显示编辑..........................................................................................................35 2.1.1 概述.......................................................................................................................35 2.1.2 地图文档显示编辑示例教程...............................................................................36 2.2 空间分析 .........................................................................................................................46 2.2.1 概述.......................................................................................................................46 2.2.2 接口说明................................................................................................................50 2.2.2 空间分析示例教程...............................................................................................51 MAPGIS70 二次开发教程(入门篇)C版 1 MAPGIS70 二次开发环境配置二次开发环境配置 在 Visual C60 环境下进行 mapgis70 二次开发,必要的设置 假设大家的 mapgis70 的 sdk 安装在 “d\dll70” ,建议大家和 mapgis70 平台安装在同一目录下, 如“d\mapgis70” 这里只是以“d\dll70”为例说明 在 VC 的“Tools”菜单下选择“Options”,选择“Directories”页面,在“Show directories for”下拉菜单中选择“Include files”,添加 mapgis70 下目录..\LIBH\INCLUDE、..\LIBH\ COMM.IDL、..\LIBH\COMM.H、..\LIBH\ COMM.TLB 如图 在“Library files”页面下添加..\LIBH\ COMM.LIB 和..\LIBH\ COMM.H 目录,如图 MAPGIS70 二次开发教程(入门篇)C版 2 针对每个 VC 工程 在“Project Settings” 菜单下选择“Settings” ,Output files下填写你 MAPGIS7 动态库所 在的目录(如..\MAPGIS70\PROGRAM) MAPGIS70 二次开发教程(入门篇)C版 3 “Link”页面下“Output file name”的设置,如图 (根据实际情况设置) MAPGIS70 二次开发教程(入门篇)C版 4 第一部分第一部分 基于插件的应用框架基于插件的应用框架 1.1 概述概述 MAPGIS7.0 采用全组件化结构,为了方便应用软件开发,系统设计了一个全新的应用 开发框架模型,使用的当前非常流行的平台插件组成框架,插件思想贯穿整个系统。这种 全新开发框架模型的最大特性是可实现动态挂接符合 MAPGIS7.0 接口标准的功能模块,使 系统具有很大程度的灵活性和可扩展性。 模块及接口说明模块及接口说明 1 MPIFrame 模块模块 该模块主要定义了框架的接口部分,实现了应用程序的动态加载和管理,主要包括 以下几个接口 IMPIApplication 插件的管理模块,实现插件之间的交互和配置. IMPIDocument 主要定义了文档的接口. IMPIEmbedView 有视图类型插件的接口定义. IMPIResource 获取插件的资源. IMPIGroupTool 组工具类型插件接口的定义. IMPITool 工具接口的定义. IObjectCategory 插件识别,加载接口. IMPICommand 命令响应接口. 2 AppFrame 模块模块 从 MPIApplication接口继承的有关 MapGis7.0 的管理部分,包含接口IGisAppFrame. 3 WPIFrame 模块模块 该模块主要实现对应用框架所加载的工具,视图等插件的界面进行定制与管理,如 工具栏的标题的设置等等. IWPIPropertyPage 属性页 IWPIButton 按钮 IWPIComboButton 组合框 IWPIToolBar 工具条 IWPIManager 界面管理器 1.2 主界面中各对象的功能与操作方式主界面中各对象的功能与操作方式 ((1)) 菜单条、工具条执行应用程序 基本地命令响应; MAPGIS70 二次开发教程(入门篇)C版 5 ((2)) 工作区数据目录组织、浏览、管理;文档目录结构管理及目录基本操作(添 加、删除操作)管理; ((3)) 主视图区地图图像显示、属性浏览、元数据浏览、表格数据浏览等; ((4)) 工具箱功能类似工具条,停靠在框架右边,便于用户操作; ((5)) 属性区提供图元属性浏览,用户自定义数据浏览; ((6)) 输出区提供操作信息的输入,操作结果的显示; ((7)) 帮助区给用户提供及时的帮助信息。 1.3 平台平台插件组成的应用程序插件组成的应用程序 没有配置任何插件的应用框架 在主菜单上单击鼠标右键,出现菜单,选择“自定义”项后,弹出“配置”对话框如图。 MAPGIS70 二次开发教程(入门篇)C版 6 单击对话框中的“应用框架配置”选项卡左侧的视图、 工具和包, 其右侧的插件列表中会显 示出各类插件。选中右侧的插件,点“加载”按钮,插件加载成功。随着插件不断的加载到 应用框架上,左侧的插件树中的项目也相应的增加。当选择视图类插件加载时,会出现方位 选择窗口,可根据习惯和需要,选择合适的视图位置。 “应用框架配置”选项卡左上方的编辑栏中的内容与应用框架的名称相对应(如我的 MAPGIS7.0 应用程序) 。 点“应用框架配置”选项卡中的“保存”按钮, 可以将当前的配置方案保存下来, 此后再次 MAPGIS70 二次开发教程(入门篇)C版 7 打开应用框架程序时,默认的框架配置为此次保存的配置。 配置完成的应用程序 MAPGIS70 二次开发教程(入门篇)C版 8 1.4 创建自己的工具条插件示例教程创建自己的工具条插件示例教程 带领您完成工具条插件的过程带领您完成工具条插件的过程 注意注意 本教程创建与 MAPGIS7PLUGDEMO 示例相同的源代码。 1.4.1 使用使用 Visual C 6.0 创建创建 ATL COM AppWizard 工程工程 在 Visual C 6.0开发环境中, 在“File”菜单上单击“New”, 选择Projects页面, 选择ATL COM AppWizard,输入工程名 MAPGIS7PLUGDEMO。 选择 Support MFC,点击 Finish MAPGIS70 二次开发教程(入门篇)C版 9 1.4.2 添加添加 Atl Object 和工具条资源和工具条资源 选择 Insert 菜单下 New Atl Object,点击 Simple Object 后,Next MAPGIS70 二次开发教程(入门篇)C版 10 在 Short Name 中输入 ToolbarName,其他自动完成 在 Attributes 页面中选择 Custom,确定完成 同样的步骤添加另外的 ITool 接口 MAPGIS70 二次开发教程(入门篇)C版 11 添加完成后在“FileView”页面中存在的文件如图 在 ToolbarDemo.rgs 中添加以下代码 HKEY_CURRENT_USER { SOFTWARE { MapGis { FrameWork70 { grouptool { MAPGIS7PLUGDEMO.ToolbarDemo.1s EA6F1FB2- F36D- 435C- 80B3- BC9EB8B712C3 { authorization { val PlugMainView.PlugGisView.1 s } MAPGIS70 二次开发教程(入门篇)C版 12 val name s PLUGDEMO val otherkey s customkey } } } } } } 注意注意EA6F1FB2- F36D- 435C- 80B3- BC9EB8B712C3 是自己创建接口的 CLSID,应该自己根 据实际情况添加。 添加工具条资源 MAPGIS70 二次开发教程(入门篇)C版 13 1.4.3 添加实现代码添加实现代码 改写 CTool.h 和 CToolbarDemo.h CTool.h 代码如下代码如下 // Tool.h Declaration of the CTool ifndef __TOOL_H_ define __TOOL_H_ include “resource.h“ // main symbols include “appframe.h“ ///////////////////////////////////////////////////////////////////////////// // CTool class ATL_NO_VTABLE CTool public CComObjectRootEx, public CComCoClass, public ITool, public IMPITool { public CTool { } DECLARE_REGISTRY_RESOURCEIDIDR_TOOL DECLARE_PROTECT_FINAL_CONSTRUCT BEGIN_COM_MAPCTool COM_INTERFACE_ENTRYITool COM_INTERFACE_ENTRYIMPITool END_COM_MAP // ITool public STDget_State/*[out, retval]*/ Enum_ToolStates *pVal; STDput_State/*[in]*/ Enum_ToolStates newVal; STDget_Resource/*[out, retval]*/ IMPIResource **pVal; STDPauseLONG Reseved; STDStopLONG Reseved; STDStartLONG Reseved; MAPGIS70 二次开发教程(入门篇)C版 14 STDOnContextMenuLONG hWnd, int X,int Y; STDOnLDlClickUINT Button,UINT Shift,int X,int Y; STDOnKeyUpUINT Button,UINT nRepCnt,UINT Shift; STDOnKeyDownUINT Button,UINT nRepCnt,UINT Shift; STDOnLMouseDown UINT Button, UINT Shift, int X,int Y; STDOnMouseMoveUINT Button, UINT Shift, int X, int Y; STDOnLMouseUp UINT Button, UINT Shift, int X, int Y; STDOnRMouseDown UINT Button, UINT Shift, int X, int Y; STDOnRMouseUp UINT Button, UINT Shift, int X, int Y; STDOnCreateIMPIApplication* pMpiApplication; STDRefreshIMPIDisplay* pPaintDriver, long lState, long Reseved; }; endif //__TOOL_H_ CToolbarDemo.h 头文件代码如下头文件代码如下 // ToolbarDemo.h Declaration of the CToolbarDemo ifndef __TOOLBARDEMO_H_ define __TOOLBARDEMO_H_ include “resource.h“ // main symbols include “appframe.h“ include “mpiframe.h“ include “mpicatid.h“ // CToolbarDemo EXTERN_C const GUID CAITID_MPI_GROUPTOOL; class ATL_NO_VTABLE CToolbarDemo public CComObjectRootEx, public CComCoClass, public IToolbarDemo, public IMPIGroupTool, public IMPICommand MAPGIS70 二次开发教程(入门篇)C版 15 { public CToolbarDemo { } DECLARE_REGISTRY_RESOURCEIDIDR_TOOLBARDEMO DECLARE_PROTECT_FINAL_CONSTRUCT BEGIN_CATEGORY_MAPCToolbarDemo IMPLEMENTED_CATEGORYCAITID_MPI_GROUPTOOL END_CATEGORY_MAP BEGIN_COM_MAPCToolbarDemo COM_INTERFACE_ENTRYIToolbarDemo COM_INTERFACE_ENTRYIMPIGroupTool COM_INTERFACE_ENTRYIMPICommand COM_INTERFACE_ENTRYIObjectCategory END_COM_MAP // IToolbarDemo public STDOnCommandUINT cmmID,LONG idExten,LONG lParam,BSTR text; STDget_ResourceUINT iIndex,IMPIResource* *pVal; //IObjectCategory public STDGetObjectCategoryIID* idCategoryBase,CLSID* clsidCategoryImpl; STDOnConnect; STDOnDisconnect; STDOnCreateIMPIApplication* pMpiApplication; //IMPIGroupTool public STDOnWinMessageWIN_MESSAGE_PTR ptrMessage,short *sFinshed; STDget_StateEnum_ToolStates *pVal; STDput_StateEnum_ToolStates newVal; STDActiveBOOL bActive; public STDget_Active/*[out, retval]*/ BOOL *pVal; STDput_Active/*[in]*/ BOOL newVal; MAPGIS70 二次开发教程(入门篇)C版 16 }; endif //__TOOLBARDEMO_H_ CTool.cpp 和和 CToolbarDemo.cpp 代码如下代码如下 ToolbarDemo.cpp 代码 (部分)其它参考代码 (部分)其它参考 MAPGIS7PLUGDEMO 示例示例 STDIMP CToolbarDemoOnCreateIMPIApplication* pMpiApplication { ifpMpiApplication m_pMpiApplication pMpiApplication; return S_OK; } //实现接口函数 STDIMP CToolbarDemoget_ResourceUINT iIndex,IMPIResource* *pVal { USES_CONVERSION; ifiIndex 0 return S_FALSE; IMPIResource* pResource NULL; //创建资源 CoCreateInstanceCLSID_MPIResource,NULL, CLSCTX_INPROC_SERVER, IID_IMPIResource, void** ifpResource { //定制资源信息 pResource- put_ResourceHandleLONG_Module.m_hInstResource; pResource- put_CaptionA2W“PLUGDEMO 工具条“; pResource- put_ToolbarResIDLONGIDR_TEST; pResource- put_ResourceMaskENUM_RESOURCE_TOOLBAR; *pVal pResource; return S_OK; } else MAPGIS70 二次开发教程(入门篇)C版 17 { *pVal NULL; return S_FALSE; } return S_OK; } STDIMP CToolbarDemoOnCommandUINT cmmID,LONG idExten,LONG lParam,BSTR text { USES_CONVERSION; switchcmmID { case ID_TT CLSIDFromStringA2W“MAPGiS7PLUGDEMO.Tool.1“, HRESULT hr CoCreateInstancetool_clsid, NULL, CLSCTX_SERVER, IID_IMPITool, void** ifSUCCEEDEDhr return S_FALSE; break; } if m_ActiveTool { m_ActiveTool- Release; m_ActiveToolNULL; } else m_ActiveTool- OnCreatem_pMpiApplication; return S_OK; } //定义对象的消息响应 STDIMP CToolbarDemoOnWinMessageWIN_MESSAGE_PTR ptrMessage,short * sFinshed { ifptrMessage return S_FALSE; LONG xPos 0; LONG yPos 0; MSG* pMsg MSG*ptrMessage; RECT rc; MAPGIS70 二次开发教程(入门篇)C版 18 GetClientRectpMsg- hwnd, switch pMsg- message { case WM_LBUTTONDOWN xPos LOWORDpMsg- lParam; yPos HIWORDpMsg- lParam; ifm_ActiveTool { //调用工具条的鼠标左键按下接口函数 m_ActiveTool- OnLMouseUp0,0,xPos,rc.bottom- yPos; } break; } return S_OK; } Tool.cpp 代码 (部分)其它参考代码 (部分)其它参考 MAPGIS7PLUGDEMO 示例示例 STDIMP CToolOnLMouseUp UINT Button, UINT Shift, int X, int Y { IMap *pMap NULL; long pVal 0; IMapLayer *pLayer NULL; D_DOT pos; CFeatureSet *pSet NULL; ITransation *pTrans NULL; GetTransation pos.xX;pos.yY; if m_pGisDoc { //获取当前激活地图 m_pGisDoc- get_CurMap if pMap { //获取当前激活图层 pMap- get_ActiveLayer ifpLayer MAPGIS70 二次开发教程(入门篇)C版 19 pLayer- QueryInterfaceIID_IFeatureLayer,void** if m_fclslayer { //取要素图层对应的要素类 m_fclslayer- get_FeatureClass m_fclsCFeatureCls*pVal; //创建结果集 pSetnew CFeatureSet; ifpTrans pTrans- DpToLppos.x,pos.y, long rim_fcls- f_Near if ri { TYPE_OBJ_ID id; long numpSet- GetObjCount; if num0 { pSet- MoveFirst; pSet- GetObjID CString str; str.at“选中 OID 为d 的要素“,id; AfxMessageBoxstr; } } delete pSet;pSetNULL; } else AfxMessageBox“没有激活的图层“; ifm_fclslayer { m_fclslayer- Release;m_fclslayerNULL; } } ifpMap { pMap- Release;pMapNULL; } MAPGIS70 二次开发教程(入门篇)C版 20 } ifpTrans { pTrans- Release; pTrans NULL; } return E_NOTIMPL; } 1.4.4 运行结果运行结果 程序运行通过后,加载 plugdemo 插件到应用框架上 MAPGIS70 二次开发教程(入门篇)C版 21 打开地图文档,激活图层,在地图视图中点击鼠标,可以选中相应的要素。 运行结果截图 MAPGIS70 二次开发教程(入门篇)C版 22 1.5 创建自己的视图插件示例教程创建自己的视图插件示例教程 带领您完成视图插件的过程带领您完成视图插件的过程 注意注意 本教程创建与 MAPGIS7ATTVIEWPLUG 示例相同的源代码。 1.5.1 使用使用 Visual C 6.0 创建创建 ATL COM AppWizard 工程工程 在 Visual C 6.0开发环境中, 在“File”菜单上单击“New”, 选择Projects页面, 选择ATL COM AppWizard,输入工程名 MAPGIS7ATTVIEWPLUG。 选择 Support MFC,点击 Finish MAPGIS70 二次开发教程(入门篇)C版 23 1.5.2 添加添加 Atl Object 选择 Insert 菜单下 New Atl Object,点击 Simple Object 后,Next MAPGIS70 二次开发教程(入门篇)C版 24 在 Short Name 中输入 AttView,其他自动完成 在 Attributes 页面中选择 Custom,确定完成 添加完成后在“FileView”页面中存在的文件如图 MAPGIS70 二次开发教程(入门篇)C版 25 在 AttView.rgs 中添加以下代码 HKEY_CURRENT_USER { SOFTWARE { MapGis { FrameWork70 { embedview { Mapgis7AttViewPlug.AttView.1s 43452594- D525- 4833- 89BB- 64622BBCD05A { val name s ATTVIEWDEMO val otherkey s customkey restrict { MAPGIS70 二次开发教程(入门篇)C版 26 } } } } } } } 注意注意43452594- D525- 4833- 89BB- 64622BBCD05A 是自己创建接口的 CLSID,应该自己根 据实际情况添加。 1.5.3 添加实现代码添加实现代码 改写 AttView.h 和 AttView.cpp AttView.h 代码如下代码如下 // AttView.h Declaration of the CAttView ifndef __ATTVIEW_H_ define __ATTVIEW_H_ include “resource.h“ // main symbols include “mpiframe.h“ include “mpicatid.h“ include “Afxcview.h“ include “appframe.h“ include “gisgridctrl.h“ /
展开阅读全文

资源标签

最新标签

长按识别或保存二维码,关注学链未来公众号

copyright@ 2019-2020“矿业文库”网

矿业文库合伙人QQ群 30735420