VC+MapX鹰眼实现

C#初学者——鹰眼功能的完整实现 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using ES 阅读详情

在网上我看到了很多用VC+MapX实现的鹰眼,可功能都不全,看了清华出的那本<<用MapX开发地理信息系统>>上面有一个用vb作的鹰眼,功能不是很强,不过简单的也够用了,我翻译了一下写成了VC版的鹰眼。希望对新手有所帮助。

我的基本实现想法是,在同一个View窗口下家两个CMapX控件,一个称为主图,一个称为鹰眼图。

CMapX m_ctrlMapX; ///主图

CMapX m_eagleMapX; ///鹰眼图

注意事项:在View里的OnCreate函数一定要想创建m_eagleMapX,这样才能看见鹰眼图。既如此:

m_eagleMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 120, 120), this, IDC_MAP_EAGLE);
  m_eagleMapX.SetGeoSet(NULL);

  m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 100, 100), this, IDC_MAP);
    m_ctrlMapX.SetGeoSet(NULL);

接下来,可以在主图里挑几层加到鹰眼图中(区域图层)

再在消息中映射几个消息:

ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEMOVE /* MouseMove */, OnMouseMoveEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
 ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEDOWN /* MouseDown */, OnMouseDownEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
 ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEUP /* MouseUp */, OnMouseUpEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
最后实现这几个函数:

void CMTRSView::OnMouseUpEagleMap(short Button, short Shift, float X, float Y)
{
 ///用户单击导航图上某点的处理
 if(strMouseState == "Begin")
 {
  double dblMapX1, dblMapY1;
  ///求出该点的地理坐标
  m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX1, &dblMapY1, miScreenToMap);
  ///设置主图的地理坐标
  m_ctrlMapX.SetCenterX(dblMapX1);
  m_ctrlMapX.SetCenterY(dblMapY1);
 }
  ///用户在导航图上框出矩形区域时的处理
 if(strMouseState == "Move")
 {
  Single sngXMax, sngXMin, sngYMax, sngYMin;
  if(PreX < X)
  {
   sngXMax = X;
   sngXMin = PreX;
  }
  else
  {
   sngXMax = PreX;
   sngXMin = X;
  }

  if(PreX < Y)
  {
   sngYMax = Y;
   sngYMin = PreY;
  }
  else
  {
   sngYMax = PreY;
   sngYMin = Y;
  }

  double dblXMax, dblXMin, dblYMax, dblYMin;
  m_eagleMapX.ConvertCoord(&sngXMin, &sngYMin, &dblXMin, &dblYMin, miScreenToMap);
  m_eagleMapX.ConvertCoord(&sngXMax, &sngYMax, &dblXMax, &dblYMax, miScreenToMap);

  CMapXRectangle rect;
  rect.CreateDispatch(rect.GetClsid());
  rect.Set(dblXMin, dblYMin, dblXMin, dblYMax);
  m_ctrlMapX.SetBounds(rect.m_lpDispatch);
 }
 strMouseState = "Stop";
}

void CMTRSView::OnMouseDownEagleMap(short Button, short Shift, float X, float Y)
{
 CMapXFeatures ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();
 for(int i = 1; i <= ftrs.GetCount(); i++)
 {
  m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));
 }
 if(Button == vbLeftButton)
 {
  strMouseState = "Begin";
  PreX = X;
  PreY = Y;
 }

}

void CMTRSView::OnMouseMoveEagleMap(short Button, short Shift, float X, float Y)
{
 if(Button != vbLeftButton) return;
 CMapXRectangle rctMap;
 CMapXPoints pntsMap;
 CMapXPoint pntMap1, pntMap2, pntMap3, pntMap4;
 CMapXStyle styLine;
 CMapXFeatures ftrs;
 CMapXFeature ftr;
 Single sngX, sngY;

 
  ///得到鼠标单击点的地理坐标
 sngX = PreX;
 sngY = PreY;
 double dblMapX1, dblMapY1;
 m_eagleMapX.ConvertCoord(&sngX, &sngY, &dblMapX1, &dblMapY1, miScreenToMap);
 
  ///得到鼠标当前点的地理坐标
 double dblMapX2, dblMapY2;
 m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX2, &dblMapY2, miScreenToMap);

 ///设置矩形的四角
 pntMap1.CreateDispatch(pntMap1.GetClsid());
 pntMap2.CreateDispatch(pntMap2.GetClsid());
 pntMap3.CreateDispatch(pntMap3.GetClsid());
 pntMap4.CreateDispatch(pntMap4.GetClsid());

 pntMap1.Set(dblMapX1, dblMapY2);
 pntMap2.Set(dblMapX2, dblMapY2);
 pntMap3.Set(dblMapX2, dblMapY1);
 pntMap4.Set(dblMapX1, dblMapY1);

 ///将矩形的四角加入点集中

 pntsMap.CreateDispatch(pntsMap.GetClsid());
 pntsMap.Add(pntMap1);
 pntsMap.Add(pntMap2);
 pntsMap.Add(pntMap3);
 pntsMap.Add(pntMap4);
 pntsMap.Add(pntMap1);

 styLine.SetLineColor(miColorBlack); ///定义样式的线条颜色
 styLine.SetLineWidth(1); ///定义样式的线条宽度
 styLine.SetLineStyle(3); ///虚线
 
 ///将导航图鹰眼层所有对象清空
 ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();
 for(int i = 1; i <= ftrs.GetCount(); i++)
 {
  m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));
 }

 ///在导航图鹰眼层画虚线矩形框,框出用户预选择的范围
 CMapXFeature ftrMap;
 COleVariant pntsVt, styVt;

 pntsVt.vt = VT_DISPATCH;
 pntsVt.pdispVal = pntsMap.m_lpDispatch;
 pntsVt.pdispVal->AddRef();

 styVt.vt = VT_DISPATCH;
 styLine.CreateDispatch(styLine.GetClsid());
 styVt.pdispVal = styLine.m_lpDispatch;
 styVt.pdispVal->AddRef();
 
 ftrMap = m_eagleMapX.GetFeatureFactory().CreateLine(pntsVt, styVt);
 m_eagleMapX.GetLayers().Item("EagleLayer").AddFeature(ftrMap);

 ///设置鼠标状态为"Move"
 strMouseState = "Move";
}

还有,可以在OnSize里面设置一下鹰眼图的大小.

还有什么问题可与我联系.

MapX与Visual C++的地图应用开发指南 MapX是MapInfo公司推出的一套高性能的ActiveX控件,它使得开发者能够在应用程序中轻松地嵌入地图功能。MapX支持栅格、矢量图层以及丰富的地图操作功能,如缩放、平移、图层控制等。MapX易于集成,并提供了一个可视化的地图对象模型,允许开发者使用标准的编程语言如C++、VB、Delphi等进行开发。在开发自定义地图工具时,首先需要明确几个核心的设计原则。这些原则会指导我们完成工具的开发,确保其功能性和易用性。 阅读详情

相关推荐

用WPF 制作的FishEye(鱼眼)控件

用WPF 制作的FishEye(鱼眼)控件 非常的绚丽。

C#进行MapX二次开发之鹰眼实现

鹰眼一般是指GIS应用中,系统有两个一大一小的图,小图提供快速定位地图位置的功能,这个是在GIS中应用比较广泛的一个功能,在Google地图中,右下角也有一个小图框,也是指的鹰图。如下图所示。    在本次介绍的例子中,左边是主地图,右边是小地图,即鹰眼。 鹰眼要实现下面几个功能: 1。 主地图变化时,鹰眼也要做出相应的位置变化,以便更好展示位置所在。 2。鹰眼地图移动到任何一个位置,主...

weixin_33766805的博客 328

鹰眼图vc实现(亲自编写)

鹰眼图的实现充斥了vb的代码,且大量荣誉,为此,本人书写了一个vc版鹰眼图实现,使用vc 6.0软件 MFC的SDI框架,视口切分技术,一个放主图,一个放鹰眼图,二者已经实现联动。

C#制作鹰眼全过程(带注释)

C#制作鹰眼全过程(带注释) axMapControl1是主控件 要看清楚事件响应     1.鹰眼地图资源载入  private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)          

旅途 2077

基于MAPX控件的鹰眼图实现

MapX 控件是一个常用的GIS功能组件,而鹰眼图是GIS中一个基本的功能。本文简介了MapX并详细说明在Visual Basic和Visual C++开发环境下利用MapX 控件实现鹰眼图的方法。

VC6+MapX 鹰眼主图联动

VC+MapX实现的鹰眼图与主图联动功能。

C#开发鹰眼浏览工具-转

以开发一个图像处理软件为例,我们使用C#语言,涉及到对图像的读取保存,鹰眼截取,效果设置,放大缩小等简单操作。其中鹰眼浏览是需要重点自学的部分。 如果是以项目为驱动,为了完成项目来自我学习,可以从以下入手: 1. 学习图像知识,开发不是要求我们达到图形学博士的水平,只要利用现有的技术就可以完成的, 只需要我们了解图像内部的结构。鉴于是学习理论知识,于...

a278713372的博客 207

mapx的鹰眼图以及浮动窗口的例子

该程序主要实现了mapx鹰眼图的实现,可以实现鹰眼和原图的联动。并且根据controlbar等重写的类,实现了可浮动,可停靠窗口的实现。

VC下鹰眼图的实现

<br />VC下鹰眼图实现的思路与VB是一样的,只不过VC的可视化程序没有VB高,VC更多的是利用代码来实现一定的功能。如利用下面的两句代码创建两个控件,分别用来显示主图和鹰眼图。 <br /><br />m_ctrlMapX.Create(NULL,   WS_VISIBLE,   CRect(0,0,300,300),   this,   IDC_MAP1); <br /><br />m_eagleMapx.Create(NULL,   WS_VISIBLE,   CRect(0,0,400,400)

helihuang的专栏 889

电阻应变式力传感器

电阻应变式力传感器

lu_fresh_student的博客 5074

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

使用VC开发MapX鹰眼

在网上我看到了很多用VC+MapX实现的鹰眼,可功能都不全,看了清华出的那本>上面有一个用vb作的鹰眼,功能不是很强,不过简单的也够用了,我翻译了一下写成了VC版的鹰眼。希望对新手有所帮助。我的基本实现想法是,在同一个View窗口下家两个CMapX控件,一个称为主图,一个称为鹰眼图。CMapX m_ctrlMapX; ///主图CMapX m_eagleMapX; ///鹰眼图注意事项:在View

696

Zephyr OS实战指南:从入门到精通物联网开发

本文提供了一份详尽的Zephyr OS实战指南,涵盖从开发环境搭建到物联网应用开发的全过程。文章详细介绍了如何利用Zephyr OS进行线程管理、设备驱动开发、低功耗设计以及蓝牙通信,并通过具体代码示例帮助开发者快速掌握这一专为物联网设备设计的开源实时操作系统,实现从入门到精通的跨越。

weixin_29201933的博客 546

【原】ArcEngine鹰眼的实现

大家都用过百度地图或者googole地图吧,在它们主地图的右下角,有个小地图窗口,这就是鹰眼窗口。用鼠标拖动鹰眼里的小窗口,则主地图便移动到相应的位置。下面就介绍鹰眼的实现。鹰眼和主地图的互动,主要体现在两个方面:一是主地图的地图改变了,则鹰眼里的矩形框要移动到对应的位置,以指示当前地图在整个地图中的位置;二是鹰眼的矩形框移动了,则主地图中显示的地图要移动到相应的位置。...

weixin_30703911的博客 333

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

【Coze 扣子案例】第 23 期・商业篇:一键获取精准商机,自动化招标信息查询与分析

通过地区和项目类型等多维度组合查询全国招标信息网数据,实现招标公告的快速定位。自动解析招标公告内容,提取关键信息,并生成结构化摘要。帮助企业高效获取精准商机,提升市场竞争力,降低人工成本,解决 “信息过载” 与 “精准匹配难” 的双重问题。

weixin_72689845的博客 1927

WPF之VistualBrush应用(制作放大镜)

我们可以通过WPF的VistualBrush获取画面中某个区域内容来当做某个元素内容的来源。根据这个原理我们就可以做出一些奇特的效果,比如放大镜的制作。                 我先举个简单的利用VistualBrush的例子(文字的镜像效果)。这样更方便了解Vistu

sanjiawan的专栏 5779

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv)

本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。

weixin_29063979的博客 147

WPF设置VistualBrush的Visual属性制作图片放大镜效果

效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放。XAML代码:// Window1.xaml    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml

祝紫山(大可山人)博客[GDI+,WPF, .Net图形图像] 8731

【异常】Python环境中没有安装 `openpyxl` 模块提示ModuleNotFoundError: No module named ‘openpyxl‘

是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的库。只是示例版本号,你可以根据需要选择不同的版本。安装完成后,再次尝试运行你的程序,应该就不会再出现。,这表明你的Python环境中缺少。运行一个Python程序时遇到了。如果由于某些原因你无法直接使用。,你可以指定版本号来安装,这里。要解决这个问题,你需要安装。

奶爸的编程之路,也就一周冷个三天 3397

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+
上一篇: 多工程里的资源互用解决方案
下一篇: 消息分流器,子控件和API宏
collision
博客等级 码龄24年 3粉丝 10原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值