分享

第三讲 MapControl与PageLayoutControl同步

 秋寒月 2010-11-29

第三讲 MapControlPageLayoutControl同步

 

在ArcMap中,能够很方面地进行MapView和Layout View两种视图的切换,而且二者之间的数据是同步显示的。

关于两种视图同步的实现方法有多种,可以使用ObjectCopy对象进行数据硬拷贝,而比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。

1、新建同步类ControlsSynchronizer

在解决方案面板中右击项目名,选择“添加|类”,在类别中选择“Visual C#项目项”,在模板中选择“类”,输入类名“ControlsSynchronizer.cs”,将以下代码覆盖自动生成的代码:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.IO;

using System.Runtime.InteropServices;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.SystemUI;

namespace _sdnMap

{

    /// <summary>

    /// This class is used to synchronize a gven PageLayoutControl and a MapControl.

    /// When initialized, the user must pass the reference of these control to the class, bind

    /// the control together by calling 'BindControls' which in turn sets a joined Map referenced

    /// by both control; and set all the buddy controls joined between these two controls.

    /// When alternating between the MapControl and PageLayoutControl, you should activate the visible control

    /// and deactivate the other by calling ActivateXXX.

    /// This calss is limited to a situation where the controls are not simultaneously visible.

    /// </summary>

    public class ControlsSynchronizer

    {

        #region class members

        private IMapControl3 m_mapControl = null;

        private IPageLayoutControl2 m_pageLayoutControl = null;

        private ITool m_mapActiveTool = null;

        private ITool m_pageLayoutActiveTool = null;

        private bool m_IsMapCtrlactive = true;

        private ArrayList m_frameworkControls = null;

        #endregion

        #region constructor

        /// <summary>

        /// 默认构造函数

        /// </summary>

        public ControlsSynchronizer()

        {

            //初始化ArrayList

            m_frameworkControls = new ArrayList();

        }

        /// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="mapControl"></param>

        /// <param name="pageLayoutControl"></param>

        public ControlsSynchronizer(IMapControl3 mapControl, IPageLayoutControl2 pageLayoutControl)

            : this()

        {

            //为类成员赋值

            m_mapControl = mapControl;

            m_pageLayoutControl = pageLayoutControl;

        }

        #endregion

        #region properties

        /// <summary>

        /// 取得或设置MapControl

        /// </summary>

        public IMapControl3 MapControl

        {

            get { return m_mapControl; }

            set { m_mapControl = value; }

        }

        /// <summary>

        /// 取得或设置PageLayoutControl

        /// </summary>

        public IPageLayoutControl2 PageLayoutControl

        {

            get { return m_pageLayoutControl; }

            set { m_pageLayoutControl = value; }

        }

        /// <summary>

        /// 取得当前ActiveView的类型

        /// </summary>

        public string ActiveViewType

        {

            get

            {

                if (m_IsMapCtrlactive)

                    return "MapControl";

                else

                    return "PageLayoutControl";

            }

        }

        /// <summary>

        /// 取得当前活动的Control

        /// </summary>

        public object ActiveControl

        {

            get

            {

                if (m_mapControl == null || m_pageLayoutControl == null)

                    throw new Exception("ControlsSynchronizer::ActiveControl:\r\nEither MapControl or PageLayoutControl are not initialized!");

                if (m_IsMapCtrlactive)

                    return m_mapControl.Object;

                else

                    return m_pageLayoutControl.Object;

            }

        }

        #endregion

        #region Methods

        /// <summary>

        /// 激活MapControl并解除the PagleLayoutControl

        /// </summary>

        public void ActivateMap()

        {

            try

            {

                if (m_pageLayoutControl == null || m_mapControl == null)

                    throw new Exception("ControlsSynchronizer::ActivateMap:\r\nEither MapControl or PageLayoutControl are not initialized!");

                //缓存当前PageLayout的CurrentTool

                if (m_pageLayoutControl.CurrentTool != null) m_pageLayoutActiveTool = m_pageLayoutControl.CurrentTool;

                //解除PagleLayout

                m_pageLayoutControl.ActiveView.Deactivate();

//激活MapControl

                m_mapControl.ActiveView.Activate(m_mapControl.hWnd);

                //将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl的CurrentTool

                if (m_mapActiveTool != null) m_mapControl.CurrentTool = m_mapActiveTool;

                m_IsMapCtrlactive = true;

                //为每一个的framework controls,设置Buddy control为MapControl

                this.SetBuddies(m_mapControl.Object);

            }

            catch (Exception ex)

            {

                throw new Exception(string.Format("ControlsSynchronizer::ActivateMap:\r\n{0}", ex.Message));

            }

        }

        /// <summary>

        /// 激活PagleLayoutControl并减活MapCotrol

        /// </summary>

        public void ActivatePageLayout()

        {

            try

            {

                if (m_pageLayoutControl == null || m_mapControl == null)

                    throw new Exception("ControlsSynchronizer::ActivatePageLayout:\r\nEither MapControl or PageLayoutControl are not initialized!");

                //缓存当前MapControl的CurrentTool

                if (m_mapControl.CurrentTool != null) m_mapActiveTool = m_mapControl.CurrentTool;

                //解除MapControl

                m_mapControl.ActiveView.Deactivate();

                //激活PageLayoutControl

                m_pageLayoutControl.ActiveView.Activate(m_pageLayoutControl.hWnd);

                //将之前PageLayoutControl最后使用的tool,作为活动的tool,赋给PageLayoutControl的CurrentTool

                if (m_pageLayoutActiveTool != null) m_pageLayoutControl.CurrentTool = m_pageLayoutActiveTool;

                m_IsMapCtrlactive = false;

                //为每一个的framework controls,设置Buddy control为PageLayoutControl

                this.SetBuddies(m_pageLayoutControl.Object);

            }

            catch (Exception ex)

            {

                throw new Exception(string.Format("ControlsSynchronizer::ActivatePageLayout:\r\n{0}", ex.Message));

            }

        }

        /// <summary>

        /// 给予一个地图, 置换PageLayoutControl和MapControl的focus map

        /// </summary>

        /// <param name="newMap"></param>

        public void ReplaceMap(IMap newMap)

        {

            if (newMap == null)

                throw new Exception("ControlsSynchronizer::ReplaceMap:\r\nNew map for replacement is not initialized!");

            if (m_pageLayoutControl == null || m_mapControl == null)

                throw new Exception("ControlsSynchronizer::ReplaceMap:\r\nEither MapControl or PageLayoutControl are not initialized!");

            //create a new instance of IMaps collection which is needed by the PageLayout

            //创建一个PageLayout需要用到的,新的IMaps collection的实例

            IMaps maps = new Maps();

            //add the new map to the Maps collection

            //把新的地图加到Maps collection里头去

            maps.Add(newMap);

            bool bIsMapActive = m_IsMapCtrlactive;

            //call replace map on the PageLayout in order to replace the focus map

            //we must call ActivatePageLayout, since it is the control we call 'ReplaceMaps'

            //调用PageLayout的replace map来置换focus map

            //我们必须调用ActivatePageLayout,因为它是那个我们可以调用"ReplaceMaps"的Control

            this.ActivatePageLayout();

            m_pageLayoutControl.PageLayout.ReplaceMaps(maps);

            //assign the new map to the MapControl

            //把新的地图赋给MapControl

            m_mapControl.Map = newMap;

            //reset the active tools

            //重设active tools

            m_pageLayoutActiveTool = null;

            m_mapActiveTool = null;

            //make sure that the last active control is activated

            //确认之前活动的control被激活

            if (bIsMapActive)

            {

                this.ActivateMap();

                m_mapControl.ActiveView.Refresh();

            }

            else

            {

                this.ActivatePageLayout();

                m_pageLayoutControl.ActiveView.Refresh();

            }

        }

        /// <summary>

        /// bind the MapControl and PageLayoutControl together by assigning a new joint focus map

        /// 指定共同的Map来把MapControl和PageLayoutControl绑在一起

        /// </summary>

        /// <param name="mapControl"></param>

        /// <param name="pageLayoutControl"></param>

        /// <param name="activateMapFirst">true if the MapControl supposed to be activated first,如果MapControl被首先激活,则为true</param>

        public void BindControls(IMapControl3 mapControl, IPageLayoutControl2 pageLayoutControl, bool activateMapFirst)

        {

            if (mapControl == null || pageLayoutControl == null)

                throw new Exception("ControlsSynchronizer::BindControls:\r\nEither MapControl or PageLayoutControl are not initialized!");

 

m_mapControl = MapControl;

            m_pageLayoutControl = pageLayoutControl;

            this.BindControls(activateMapFirst);

        }

        /// <summary>

        /// bind the MapControl and PageLayoutControl together by assigning a new joint focus map

        /// 指定共同的Map来把MapControl和PageLayoutControl绑在一起

        /// </summary>

        /// <param name="activateMapFirst">true if the MapControl supposed to be activated first,如果MapControl被首先激活,则为true</param>

        public void BindControls(bool activateMapFirst)

        {

            if (m_pageLayoutControl == null || m_mapControl == null)

                throw new Exception("ControlsSynchronizer::BindControls:\r\nEither MapControl or PageLayoutControl are not initialized!");

            //create a new instance of IMap

            //创造IMap的一个实例

            IMap newMap = new MapClass();

            newMap.Name = "Map";

            //create a new instance of IMaps collection which is needed by the PageLayout

            //创造一个新的IMaps collection的实例,这是PageLayout所需要的

            IMaps maps = new Maps();

            //add the new Map instance to the Maps collection

            //把新的Map实例赋给Maps collection

            maps.Add(newMap);

            //call replace map on the PageLayout in order to replace the focus map

            //调用PageLayout的replace map来置换focus map

            m_pageLayoutControl.PageLayout.ReplaceMaps(maps);

            //assign the new map to the MapControl

            //把新的map赋给MapControl

            m_mapControl.Map = newMap;

            //reset the active tools

            //重设active tools

            m_pageLayoutActiveTool = null;

            m_mapActiveTool = null;

            //make sure that the last active control is activated

            //确定最后活动的control被激活

            if (activateMapFirst)

                this.ActivateMap();

            else

                this.ActivatePageLayout();

        }

        /// <summary>

        ///by passing the application's toolbars and TOC to the synchronization class, it saves you the

        ///management of the buddy control each time the active control changes. This method ads the framework

        ///control to an array; once the active control changes, the class iterates through the array and

        ///calles SetBuddyControl on each of the stored framework control.

        /// </summary>

        /// <param name="control"></param>

        public void AddFrameworkControl(object control)

        {

            if (control == null)

                throw new Exception("ControlsSynchronizer::AddFrameworkControl:\r\nAdded control is not initialized!");

            m_frameworkControls.Add(control);

        }

        /// <summary>

        /// Remove a framework control from the managed list of controls

        /// </summary>

        /// <param name="control"></param>

        public void RemoveFrameworkControl(object control)

        {

            if (control == null)

                throw new Exception("ControlsSynchronizer::RemoveFrameworkControl:\r\nControl to be removed is not initialized!");

            m_frameworkControls.Remove(control);

        }

        /// <summary>

        /// Remove a framework control from the managed list of controls by specifying its index in the list

        /// </summary>

        /// <param name="index"></param>

        public void RemoveFrameworkControlAt(int index)

        {

            if (m_frameworkControls.Count < index)

                throw new Exception("ControlsSynchronizer::RemoveFrameworkControlAt:\r\nIndex is out of range!");

            m_frameworkControls.RemoveAt(index);

        }

        /// <summary>

        /// when the active control changes, the class iterates through the array of the framework controls

        ///  and calles SetBuddyControl on each of the controls.

        /// </summary>

        /// <param name="buddy">the active control</param>

        private void SetBuddies(object buddy)

        {

            try

            {

                if (buddy == null)

                    throw new Exception("ControlsSynchronizer::SetBuddies:\r\nTarget Buddy Control is not initialized!");

                foreach (object obj in m_frameworkControls)

                {

                    if (obj is IToolbarControl)

                    {

                        ((IToolbarControl)obj).SetBuddyControl(buddy);

                    }

                    else if (obj is ITOCControl)

                    {

                        ((ITOCControl)obj).SetBuddyControl(buddy);

                    }

                }

            }

            catch (Exception ex)

            {

                throw new Exception(string.Format("ControlsSynchronizer::SetBuddies:\r\n{0}", ex.Message));

            }

        }

        #endregion

    }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多