关于MapControl和PageLayout地图同步的问题
来源:互联网 发布:荒岛特训 知乎 编辑:程序博客网 时间:2024/04/30 16:18
按照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) { } }
- 关于MapControl和PageLayout地图同步的问题
- 关于MapControl和Map添加事件监听无效的问题
- ArcGIS Engine MapControl和GlobeControl同步
- ArcGIS Engine MapControl和GlobeControl同步
- 关于基础百度地图和地图导航的bug问题
- map和pagelayout
- 在MapControl中图层不显示的问题
- MapXtreme2005 不用mapcontrol 控件实现地图的显示
- MapControl无法显示地图文档的解决方
- 关于线程和进程的同步问题
- 关于线程和进程的同步问题
- 关于DWR的同步和异步问题!
- 关于同步操作和数据同步的问题
- map与pagelayout同步新方法(转帖某位大神的博客)
- 实现MapControl与GlobeControl同步
- MapControl与PageLayoutControl同步一
- MapControl与PageLayoutControl同步二
- 问题--关于同步和异步
- oracle入门问题
- linux-2.6.32内核LCD驱动移植
- 德梅齐里亚克砝码问题
- mysql异常错误 ERROR 2002
- win7主机与WMware ubuntu 12.04 samba服务的搭建
- 关于MapControl和PageLayout地图同步的问题
- cocos2dx多分辨率适配解析
- 2012华为编程大赛第三题
- 好的博文
- i++; i=i+1 ;i+=1
- Nosql Mongodb之旅(2)
- 排序算法之--冒泡排序
- ios-label-字体大小-日记
- win7系统:用户账户控制如何取消掉