zoukankan      html  css  js  c++  java
  • 关于MapControl和PageLayout地图同步的问题

      按照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

  • 相关阅读:
    javascript 读取内联之外的样式(style、currentStyle、getComputedStyle区别介绍) (转载)
    JS笔记2 --定义对象
    JS笔记1
    Chrome 中的 JavaScript 断点设置和调试技巧 (转载)
    屏蔽移动端浏览器的长按事件
    移除IOS下按钮的原生样式
    HTML5中的Range对象的研究(转载)
    js中的 window.location、document.location、document.URL 对像的区别(转载)
    html中插入flash代码详解(转载)
    关于获取各种浏览器可见窗口大小(转载)
  • 原文地址:https://www.cnblogs.com/CSharpLover/p/5986747.html
Copyright © 2011-2022 走看看