摘要
MapX 控件是一个常用的GIS功能组件,而鹰眼图是GIS中一个基本的功能。本文主要说明在VC++ .NET下如何利用MapX 控件实现鹰眼
图,并使它与主图联动。
问题
关于在VC++(以下操作均在VC++ .NET下实现,VC6中只是操作步骤稍有不同,原理一致)中增加MAPX控件这一问题,MAPX的.hlp文件
里面已经有详细的描述,鹰眼图的使用也在网址[1]中有涉及。但是存在如下不足:
A).hlp是英文的,而且步骤描述针对VC6
B)[1]中的主要描述语言是VB,与之对应的VC部分的描述有所错漏,并且鹰眼图没有涉及"联动"这一最常用的功能
本文主要解决上述问题。
说明
本文实验环境为 .NET 1.1,MAPX4.5。
为了让鹰眼图脱离主View单独浮动,决定使用CJLibrary控件来放置鹰眼图,该控件可由网址[2]下载。
鹰眼图上面有一个红色矩形框,表示主图的当前可视范围。要求点击鼠标左键来移动此框时能够引起主图的联动。
主图上有放大、缩小、移动三个工具按钮,要求主图变化的时候,能够引起鹰眼图矩形框的联动。
实现的易错点在CMapXEagleBar::OnMouseUpInMap函数, 鹰眼图中矩形框的移动要经过如下几步:
a) 得到矩形框四个顶点移动前的屏幕坐标,
b) 计算出中心点坐标,
c) 通过消息传入的参数得到移动后的中心点屏幕坐标
d) 计算前后中心点的偏移(以屏幕坐标作为参考)
e) 计算移动后的矩形框的四个顶点的屏幕坐标
f) 将四个顶点的屏幕坐标转换成地理坐标
g) 显示新的矩形框
源码下载: https://files.cnblogs.com/eXcel/MapXSampleMDI.rar
详细步骤
1) 新建MDI项目MapXSampleMDI,视图类为CMapXSampleMDIView
2)打开MAPX安装目录,找到 MapX 4.0\Samples40\C++\Buffer 子目录下的MAPX.H, MAPX.CPP两个文件,将这两个文件复制到
MapXSampleMDI的项目目录中
3)在stdafx.h中增加 #include "MapX.h"
4)通过菜单中的"文件"->"添加现有项",将MAPX.CPP加入项目中
5)在资源中增加两个字符串IDC_MAP,IDC_MAP_EAGLE,字符串的值无所谓,采用系统缺省值就行
6) 资源中新建一个名为IDR_TOOLBARMAP的TOOLBAR
ID分别为 ID_MAP_TOOL_ZOOMIN, ID_MAP_TOOL_ZOOMOUT, ID_MAP_TOOL_PAN
7)在MapXSampleMDIView.h增加如下成员
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
8)在MapXSampleMDIView.CPP中增加如下代码
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
9)stdafx.h中增加#include "CJLibrary.h"
把CJLibrary的头文件路径加进 MapXSampleMDI 项目属性中的 "C/C++" -> "附加包含目录"中
把CJLibrary的静态库文件路径加进 MapXSampleMDI 项目属性中的 "链接器" -> "附加包含目录"中
把CJLibrary的动态库文件复制到 MapXSampleMDI 项目的输出目录中
10)新建类CMapXEagleBar,代码如下
//MapXEagleBar.h
2
//MapXEagleBar.cpp
2
3
4
5
6
7
8
9
10
11
12
13
14
11) 新增一个头文件,用来定义自定义WINDOWS消息,以及两个小结构
// CommonDef.h
并在stdafx.h中增加 #include "CommonDef.h"
12) 为了能够处理一Doc多View的情况,即鹰眼图能够引发与Doc关联的所有View的联动, 需要在MapXSampleMDIDoc.h中增加如下定义:
2
3
4
13)为了在主图和鹰眼图之间传递变化触发的消息, 需要修改MainFrm.h 和 MainFrm.cpp, 为它们增加消息转发的功能
// MainFrm.h : CMainFrame 类的接口
2
3
4
// MainFrm.cpp : CMainFrame 类的实现
2
3
4
5
6
7
8
Last Updated: Tuesday, May 17, 2005 21:48:05
eXcel Wong