按照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. 巧用Fiddler代理来禁止资源缓存,从而达到每次都是从服务器加载最新的资源

    Fiddler ->  Rules ->  Performance  -> Disable Caching 直接设置禁用缓存,再在没有清除缓存功能的APP 中重新加载最新的页面, 每 ...

  2. php中各种操作字符串和时间戳的代码关键词

    <?php/** * Created by 郭鹏. * User: msi * Date: 2017/9/27 * Time: 14:17 */ //随机数生成器echo rand();echo ...

  3. bpf 指令集

    58 struct bpf_insn { 59 __u8 code; /* opcode */ 60 __u8 dst_reg:4; /* dest register */ 61 __u8 src_r ...

  4. RabbitMQ vhost 配置

    RabbitMQ vhost 配置 rabbitmqctl set_vhost_limits是用来定义虚拟主机限制的命令 配置最大连接限制 要限制vhost vhost_name中并发客户端连接的 总 ...

  5. hdu 1811 Rank of Tetris (拓扑 & 并查集)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. [AtCoder ARC093F]Dark Horse

    题目大意:有$2^n$个人,每相邻的两个人比赛一次.令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜:否则若$b\in S$则$b$获胜,不然$1$获胜. ...

  7. SPOJ 1825 Free Tour | 终极之树分治

    求树上最长路径使得经过的拥挤节点个数不超过K //欢迎访问这个博客!http://www.cnblogs.com/luyouqi233/p/8036828.html #include<cstdi ...

  8. POJ2374 Fence Obstacle Course 【线段树】

    题目链接 POJ2374 题解 题意: 给出\(n\)个平行于\(x\)轴的栅栏,求从一侧栅栏的某个位置出发,绕过所有栅栏到达另一侧\(x = 0\)位置的最短水平距离 往上说都是线段树优化dp 我写 ...

  9. P4397 [JLOI2014]聪明的燕姿

    P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...

  10. APIO2017游记

    铁牌选手爆零滚粗记QAQ........ CCF说不让讨论APIO相关内容不过现在应该没事了吧QAQ day0:上午还在学校填清北夏令营的表,下午上火车去北京,晚上颓颓颓...... day1:上午网 ...