摘要
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,字符串的值无所谓,采用系统缺省值就行
[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能

6) 资源中新建一个名为IDR_TOOLBARMAP的TOOLBAR[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
ID分别为 ID_MAP_TOOL_ZOOMIN, ID_MAP_TOOL_ZOOMOUT, ID_MAP_TOOL_PAN

7)在MapXSampleMDIView.h增加如下成员

 1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能protected:
 2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    CMapX  m_ctrlMapX;
 3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 4[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能//消息映射函数
 5[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能protected:
 6[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    DECLARE_MESSAGE_MAP()
 7[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 8[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnSize(UINT nType, int cx, int cy);
 9[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnSetFocus(CWnd* pOldWnd);
10[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnMapToolPan();
11[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnMapToolZoomin();
12[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnMapToolZoomout();
13[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnUpdateMapToolPan(CCmdUI* pCmdUI);
14[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnUpdateMapToolZoomin(CCmdUI* pCmdUI);
15[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnUpdateMapToolZoomout(CCmdUI* pCmdUI);
16[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    DECLARE_EVENTSINK_MAP()
17[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能    afx_msg void OnMapViewChanged();
18

8)在MapXSampleMDIView.CPP中增加如下代码

  1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能#define CUST_INFO 1
  2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
  3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能BEGIN_MESSAGE_MAP(CMapXSampleMDIView, CView)
  4[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_CREATE()
  5[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_SIZE()
  6[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_SETFOCUS()
  7[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_COMMAND(ID_MAP_TOOL_PAN, OnMapToolPan)
  8[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_COMMAND(ID_MAP_TOOL_ZOOMIN, OnMapToolZoomin)
  9[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_COMMAND(ID_MAP_TOOL_ZOOMOUT, OnMapToolZoomout)
 10[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_UPDATE_COMMAND_UI(ID_MAP_TOOL_PAN, OnUpdateMapToolPan)
 11[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_UPDATE_COMMAND_UI(ID_MAP_TOOL_ZOOMIN, OnUpdateMapToolZoomin)
 12[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_UPDATE_COMMAND_UI(ID_MAP_TOOL_ZOOMOUT, OnUpdateMapToolZoomout)
 13[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能END_MESSAGE_MAP()
 14[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 15[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能BEGIN_EVENTSINK_MAP(CMapXSampleMDIView, CView)
 16[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_EVENT(CMapXSampleMDIView, IDC_MAP, MAPX_DISPID_MAPVIEWCHANGED, OnMapViewChanged, VTS_NONE)
 17[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能END_EVENTSINK_MAP()
 18[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 19[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能// CMapXSampleMDIView 消息处理程序
 20[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能int CMapXSampleMDIView::OnCreate(LPCREATESTRUCT lpCreateStruct)
 21

9)stdafx.h中增加#include "CJLibrary.h"
  把CJLibrary的头文件路径加进 MapXSampleMDI 项目属性中的 "C/C++" -> "附加包含目录"中
  把CJLibrary的静态库文件路径加进 MapXSampleMDI 项目属性中的 "链接器" -> "附加包含目录"中
  把CJLibrary的动态库文件复制到 MapXSampleMDI 项目的输出目录中

10)新建类CMapXEagleBar,代码如下

//MapXEagleBar.h

 1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能class CMapXEagleBar : public CCJControlBar
 2

//MapXEagleBar.cpp

  1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能BEGIN_MESSAGE_MAP(CMapXEagleBar, CCJControlBar)
  2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 //{{AFX_MSG_MAP(CWarnListBar)
  3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_SIZE()
  4[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_CREATE()
  5[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 //}}AFX_MSG_MAP
  6[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能END_MESSAGE_MAP()
  7[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
  8[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能BEGIN_EVENTSINK_MAP(CMapXEagleBar, CCJControlBar)
  9[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_EVENT(CMapXEagleBar, IDC_MAP_EAGLE, DISPID_MOUSEUP,OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
 10[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能END_EVENTSINK_MAP()
 11[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 12[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能// CMapXEagleBar 消息处理程序
 13[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能int CMapXEagleBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
 14

11) 新增一个头文件,用来定义自定义WINDOWS消息,以及两个小结构

// CommonDef.h

 1

并在stdafx.h中增加 #include "CommonDef.h"


12) 为了能够处理一Doc多View的情况,即鹰眼图能够引发与Doc关联的所有View的联动, 需要在MapXSampleMDIDoc.h中增加如下定义:

1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能public:
2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 double  CenterPointX;  //鹰眼图矩形框中央点的X坐标
3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 double  CenterPointY;  //鹰眼图矩形框中央点的Y坐标
4[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能

 13)为了在主图和鹰眼图之间传递变化触发的消息, 需要修改MainFrm.h 和 MainFrm.cpp, 为它们增加消息转发的功能
// MainFrm.h : CMainFrame 类的接口

 1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能#include "MapXEagleBar.h"
 2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能class CMainFrame : public CMDIFrameWnd
 4

// MainFrm.cpp : CMainFrame 类的实现

 1[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
 2[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_WM_CREATE()
 3[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_MESSAGE(WM_MAPXVIEW_CHANGED, OnMapViewChange)
 4[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能 ON_MESSAGE(WM_MAPX_EAGLE_FEATURE_MOVE, OnMapEagleChange)
 5[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能END_MESSAGE_MAP()
 6[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能
 7[HowTo:]如何在VC++中使用MAPX控件,并实现鹰眼联动功能int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 8

                                              Last Updated:  Tuesday, May 17, 2005 21:48:05

                                                             eXcel Wong

相关文章:

  • 2021-06-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
猜你喜欢
  • 2022-12-23
  • 2021-12-11
  • 2021-04-19
  • 2022-01-13
  • 2021-08-19
  • 2021-07-01
  • 2021-06-14
相关资源
相似解决方案