ControlsSynchronizer.cs
资源名称:vcengine.rar [点击查看]
上传用户:songlsx
上传日期:2022-06-19
资源大小:2227k
文件大小:14k
源码类别:
GIS编程
开发平台:
Visual C++
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using System.Runtime.InteropServices;
- using ESRI.ArcGIS.Carto;
- using ESRI.ArcGIS.Controls;
- using ESRI.ArcGIS.esriSystem;
- using ESRI.ArcGIS.SystemUI;
- namespace LinGIS
- {
- [Guid("ba7d94a2-21d0-41e2-96aa-b4ab62678cc7")]
- [ClassInterface(ClassInterfaceType.None)]
- [ProgId("LinGIS.ControlsSynchronizer")]
- 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:rnEither 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:rnEither 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:rn{0}", ex.Message));
- }
- }
- /// <summary>
- /// 激活PagleLayoutControl并减活MapCotrol
- /// </summary>
- public void ActivatePageLayout()
- {
- try
- {
- if (m_pageLayoutControl == null || m_mapControl == null)
- throw new Exception("ControlsSynchronizer::ActivatePageLayout:rnEither 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:rn{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:rnNew map for replacement is not initialized!");
- if (m_pageLayoutControl == null || m_mapControl == null)
- throw new Exception("ControlsSynchronizer::ReplaceMap:rnEither 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:rnEither 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:rnEither 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:rnAdded 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:rnControl 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:rnIndex 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:rnTarget 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:rn{0}", ex.Message));
- }
- }
- #endregion
- }
- }