按照ArcMap的处理方式,地图和制图是分两个页面的,他们之间通过共享同一个Map对象来实现地图同步,具体做法就是在PageLayoutControl的PageLayoutReplaced事件发生时,将当前的活动地图指派给MapControl,然后在二者之间实现切换,基本做法如下:

        private void PageLayoutEvents_OnPageLayoutReplaced(object newPageLayout)
{
m_MapControl.Map = m_PageLayoutControl.ActiveView.FocusMap;
if (m_bIsMapCtrActive)
{
//当MapControl的Map对象被替换后,需要重新激活MapControl
ActiveMapControl();
}
else
{
//当PageLayoutControl的PageLayout对象被替换后,需要重新激活PageLayoutControl
ActivePageLayoutControl();
}
}
public void ActiveMapControl()
{
try
{
m_PageLayoutControl.ActiveView.Deactivate();
//if (!m_MapControl.ActiveView.IsActive()) //如果在激活状态下重复激活,程序会崩溃
m_MapControl.ActiveView.Activate(m_MapControl.hWnd); //会触发ActiveView的ContentsChanged事件 m_bIsMapCtrActive = true;
}
catch (System.Exception )
{
}
} public void ActivePageLayoutControl()
{
try
{
m_MapControl.ActiveView.Deactivate();
m_PageLayoutControl.ActiveView.Activate(m_PageLayoutControl.hWnd);
m_bIsMapCtrActive = false;
}
catch (System.Exception)
{
}
}

  在PageLayoutControl加载Mxd文档后,会发生PageLayoutReplaced事件,在此时,将其ActiveMap指派给地图控件,但是这里会出现两问题,一是Pagelayout中的图例、比例尺等会与地图失去关联,也就是缩放地图或调整地图时,图例、比例尺等地图整饰要素不会自动更新;另一个问题就是从地图切换到PageLayout时,地图会发生闪烁和跳动,地图的刷新总是慢一拍。实际上,我们在AE携带的示例代码MapAndPageLayoutSynchApp中可以看到,里面并不是简单的把PageLayout的ActieMap赋给MapControl,而是通过Maps和ReplaceMaps来执行一次地图替换后再执行地图的赋值操作,ArcGIS的帮助文档里没有讲为什么要这么做,我们也搞不清楚问什么要这么做,但是仿照这样的方式进行处理,却可以解决Map和图例、比例尺等失去关联的问题。如下:

        private void PageLayoutEvents_OnPageLayoutReplaced(object newPageLayout)
{
//////////////////////////////////////////////////////////////////////////
//仿照AE范例代码MapAndPageLayoutSynchApp中的示例,解决图例、指北针、比例尺
//失去关联的问题
m_MapControl.ActiveView.Deactivate();
m_PageLayoutControl.ActiveView.Activate(m_PageLayoutControl.hWnd);
IMaps pMaps = GetMaps(m_PageLayoutControl.PageLayout);
m_PageLayoutControl.PageLayout.ReplaceMaps(pMaps);
//////////////////////////////////////////////////////////////////////////
m_MapControl.Map = m_PageLayoutControl.ActiveView.FocusMap;
if (m_bIsMapCtrActive)
{
//当MapControl的Map对象被替换后,需要重新激活MapControl
ActiveMapControl();
}
else
{
//当PageLayoutControl的PageLayout对象被替换后,需要重新激活PageLayoutControl
ActivePageLayoutControl();
}
}
private IMaps GetMaps(IPageLayout pPageLayout)
{
IMaps pMaps = new Maps();
IGraphicsContainer pGraphicsContainer = pPageLayout as IGraphicsContainer;
pGraphicsContainer.Reset();
IElement pElement = pGraphicsContainer.Next();
while (pElement != null)
{
if (pElement is IMapFrame)
{
IMapFrame pMapFrame = pElement as IMapFrame;
pMaps.Add(pMapFrame.Map);
}
pElement = pGraphicsContainer.Next();
}
return pMaps;
}

  对于第二个问题,ArcGIS的开发文档中,也没有做出任何说明和解释。但是按照上面的处理方式,我们在地图控件和制图控件之间切换时不停的对二者的ActiveView执行激活和反激活。因为Map在制图控件中只是PageLayout的一个成员,因此在切换到地图时,Map被激活了, 而对于PageLayout来说,此时它里面的要素应该都是被DeActived的,反过来,切换到PageLaout时,Map理应被激活,但是又因为MapControl的DeActived而失活,对于包含多个地图的PageLayout来说,很容易出现制图要素没有完全被激活的现象,于是就会出现视图闪烁问题。针对这个问题,我们可以在切换到PageLayout时对PageLayout中的所有要素全部执行一遍激活操作。实验发现,样做的确可以解决问题,并且不会有任何问题,下面是处理代码:

        public void ActivePageLayoutControl()
{
try
{
m_MapControl.ActiveView.Deactivate();
m_PageLayoutControl.ActiveView.Activate(m_PageLayoutControl.hWnd); IGraphicsContainer pGraphicsContainer = m_PageLayoutControl.GraphicsContainer;
pGraphicsContainer.Reset();
IElement pElement = pGraphicsContainer.Next();
IDisplay pDisplay = m_PageLayoutControl.ActiveView.ScreenDisplay as IDisplay;
while (pElement != null)
{
pElement.Activate(pDisplay);
pElement = pGraphicsContainer.Next();
}
m_bIsMapCtrActive = false;
}
catch (System.Exception)
{
}
}

原文地址:http://blog.csdn.net/giselite/article/details/24239509

关于MapControl和PageLayout地图同步的问题的更多相关文章

  1. 一款已上市MMO手游地图同步方案总结

    1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都 ...

  2. 【转】一款已上市MMO手游地图同步方案总结

    转自游戏开发主席 1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲 ...

  3. 解码mmo游戏服务器三:大地图同步(aoi)

    问题引入:aoi(area of interest).在大地图中,玩家只需要关心自己周围的对象变化,而不需要关心距离较远的对象的变化.所以大地图中的数据不需要全部广播,只要同步玩家自己视野范围的消息即 ...

  4. 《ArcGIS Engine+C#实例开发教程》第三讲 MapControl与PageLayoutControl同步

    原文:<ArcGIS Engine+C#实例开发教程>第三讲 MapControl与PageLayoutControl同步 摘要:在ArcMap中,能够很方面地进行MapView和Layo ...

  5. ArcEngine - 地图和布局同步

    1,定义同步的类: using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...

  6. map与pagelayout同步新方法

    本文转自: http://hi.baidu.com/murphy1314/blog/item/3d3144f319b19dcf0a46e0a4.html 前天写的那个MapControl和Pagela ...

  7. C#:MapControl基本操作代码整理

    整理了 MapConrol各基本功能的实现代码 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  8. ArcGIS Engine开发之视图同步

    数据视图与布局视图的同步 数据视图与布局视图的同步,首先要保证数据的一致性,其次就是数据显示范围的一致性.该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScr ...

  9. 百度地图、ECharts整合HT for Web网络拓扑图应用

    前一篇谈及到了ECharts整合HT for Web的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图.ECharts和HT for Web三者结合起来 ...

随机推荐

  1. Python全栈工程师(函数的传参)

     ParisGabriel   感谢 大家的支持                                                               每天坚持 一天一篇 点个订 ...

  2. Opencv3.3.1安装包

    这个资源是Opencv3.3.1安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  3. Spring 笔记(二)模块体系

    前言 在 Spring Boot 出现之前,开发一个 Spring 项目总会需要添加很多依赖.但是我们在配置依赖的时候,往往不太明确各依赖的具体作用,经常是从网上复制粘贴. 为何需要添加这些依赖?各依 ...

  4. HTTP 返回状态代码详细解释

    一:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 100(继续)请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:101(切换协议)请求者已要 ...

  5. 【干货】2个小时教你hexo博客添加评论、打赏、RSS等功能 (转)

    备注:该教程基于Hexo 2.x版本,目前Hexo是3.x版本,照本教程实现有可能会出现404错误,笔者目前还未找时间去解决,待笔者找时间解决该问题后,再写一篇该问题的解决教程,给各位读者带来困扰,还 ...

  6. 多校4 lazy running (最短路)

    lazy running(最短路) 题意: 一个环上有四个点,从点2出发回到起点,走过的距离不小于K的最短距离是多少 \(K <= 10^{18} 1 <= d <= 30000\) ...

  7. C#实战Microsoft Messaging Queue(MSMQ)消息队列

    前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,就可以执行余下的代 ...

  8. Codeforces Round #352 (Div. 2) A

    A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. mysql5.6免安装配置(菜鸟版)

    mysql5.6免安装配置 MySQL5.6.13安装步骤(Windows7 32位) 1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包 将以下载的My ...

  10. RQNOJ 34 紧急援救

    题目描述 话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他 ...