ControlsSynchronizer.cs
上传用户:songlsx
上传日期:2022-06-19
资源大小:2227k
文件大小:14k
源码类别:

GIS编程

开发平台:

Visual C++

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6. using ESRI.ArcGIS.Carto;
  7. using ESRI.ArcGIS.Controls;
  8. using ESRI.ArcGIS.esriSystem;
  9. using ESRI.ArcGIS.SystemUI;
  10. namespace LinGIS
  11. {
  12.     [Guid("ba7d94a2-21d0-41e2-96aa-b4ab62678cc7")]
  13.     [ClassInterface(ClassInterfaceType.None)]
  14.     [ProgId("LinGIS.ControlsSynchronizer")]
  15.     public class ControlsSynchronizer
  16.     {
  17.         #region class members
  18.         private IMapControl3 m_mapControl = null;
  19.         private IPageLayoutControl2 m_pageLayoutControl = null;
  20.         private ITool m_mapActiveTool = null;
  21.         private ITool m_pageLayoutActiveTool = null;
  22.         private bool m_IsMapCtrlactive = true;
  23.         private ArrayList m_frameworkControls = null;
  24.         #endregion
  25.         #region constructor
  26.         /// <summary>
  27.         /// 默认构造函数
  28.         /// </summary>
  29.         public ControlsSynchronizer()
  30.         {
  31.             //初始化ArrayList
  32.             m_frameworkControls = new ArrayList();
  33.         }
  34.         /// <summary>
  35.         /// 构造函数
  36.         /// </summary>
  37.         /// <param name="mapControl"></param>
  38.         /// <param name="pageLayoutControl"></param>
  39.         public ControlsSynchronizer(IMapControl3 mapControl, IPageLayoutControl2 pageLayoutControl)
  40.             : this()
  41.         {
  42.             //为类成员赋值
  43.             m_mapControl = mapControl;
  44.             m_pageLayoutControl = pageLayoutControl;
  45.         }
  46.         #endregion
  47.         #region properties
  48.         /// <summary>
  49.         /// 取得或设置MapControl
  50.         /// </summary>
  51.         public IMapControl3 MapControl
  52.         {
  53.             get { return m_mapControl; }
  54.             set { m_mapControl = value; }
  55.         }
  56.         /// <summary>
  57.         /// 取得或设置PageLayoutControl
  58.         /// </summary>
  59.         public IPageLayoutControl2 PageLayoutControl
  60.         {
  61.             get { return m_pageLayoutControl; }
  62.             set { m_pageLayoutControl = value; }
  63.         }
  64.         /// <summary>
  65.         /// 取得当前ActiveView的类型
  66.         /// </summary>
  67.         public string ActiveViewType
  68.         {
  69.             get
  70.             {
  71.                 if (m_IsMapCtrlactive)
  72.                     return "MapControl";
  73.                 else
  74.                     return "PageLayoutControl";
  75.             }
  76.         }
  77.         /// <summary>
  78.         /// 取得当前活动的Control
  79.         /// </summary>
  80.         public object ActiveControl
  81.         {
  82.             get
  83.             {
  84.                 if (m_mapControl == null || m_pageLayoutControl == null)
  85.                     throw new Exception("ControlsSynchronizer::ActiveControl:rnEither MapControl or PageLayoutControl are not initialized!");
  86.                 if (m_IsMapCtrlactive)
  87.                     return m_mapControl.Object;
  88.                 else
  89.                     return m_pageLayoutControl.Object;
  90.             }
  91.         }
  92.         #endregion
  93.         #region Methods
  94.         /// <summary>
  95.         /// 激活MapControl并减活the PagleLayoutControl
  96.         /// </summary>
  97.         public void ActivateMap()
  98.         {
  99.             try
  100.             {
  101.                 if (m_pageLayoutControl == null || m_mapControl == null)
  102.                     throw new Exception("ControlsSynchronizer::ActivateMap:rnEither MapControl or PageLayoutControl are not initialized!");
  103.                 //缓存当前PageLayout的CurrentTool
  104.                 if (m_pageLayoutControl.CurrentTool != null) m_pageLayoutActiveTool = m_pageLayoutControl.CurrentTool;
  105.                 //减活PagleLayout
  106.                 m_pageLayoutControl.ActiveView.Deactivate();
  107.                 //激活MapControl
  108.                 m_mapControl.ActiveView.Activate(m_mapControl.hWnd);
  109.                 //将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl的CurrentTool
  110.                 if (m_mapActiveTool != null) m_mapControl.CurrentTool = m_mapActiveTool;
  111.                 m_IsMapCtrlactive = true;
  112.                 //为每一个的framework controls,设置Buddy control为MapControl
  113.                 this.SetBuddies(m_mapControl.Object);
  114.             }
  115.             catch (Exception ex)
  116.             {
  117.                 throw new Exception(string.Format("ControlsSynchronizer::ActivateMap:rn{0}", ex.Message));
  118.             }
  119.         }
  120.         /// <summary>
  121.         /// 激活PagleLayoutControl并减活MapCotrol
  122.         /// </summary>
  123.         public void ActivatePageLayout()
  124.         {
  125.             try
  126.             {
  127.                 if (m_pageLayoutControl == null || m_mapControl == null)
  128.                     throw new Exception("ControlsSynchronizer::ActivatePageLayout:rnEither MapControl or PageLayoutControl are not initialized!");
  129.                 //缓存当前MapControl的CurrentTool
  130.                 if (m_mapControl.CurrentTool != null) m_mapActiveTool = m_mapControl.CurrentTool;
  131.                 //减活MapControl
  132.                 m_mapControl.ActiveView.Deactivate();
  133.                 //激活PageLayoutControl
  134.                 m_pageLayoutControl.ActiveView.Activate(m_pageLayoutControl.hWnd);
  135.                 //将之前PageLayoutControl最后使用的tool,作为活动的tool,赋给PageLayoutControl的CurrentTool
  136.                 if (m_pageLayoutActiveTool != null) m_pageLayoutControl.CurrentTool = m_pageLayoutActiveTool;
  137.                 m_IsMapCtrlactive = false;
  138.                 //为每一个的framework controls,设置Buddy control为PageLayoutControl
  139.                 this.SetBuddies(m_pageLayoutControl.Object);
  140.             }
  141.             catch (Exception ex)
  142.             {
  143.                 throw new Exception(string.Format("ControlsSynchronizer::ActivatePageLayout:rn{0}", ex.Message));
  144.             }
  145.         }
  146.         /// <summary>
  147.         /// 给予一个地图, 置换PageLayoutControl和MapControl的focus map
  148.         /// </summary>
  149.         /// <param name="newMap"></param>
  150.         public void ReplaceMap(IMap newMap)
  151.         {
  152.             if (newMap == null)
  153.                 throw new Exception("ControlsSynchronizer::ReplaceMap:rnNew map for replacement is not initialized!");
  154.             if (m_pageLayoutControl == null || m_mapControl == null)
  155.                 throw new Exception("ControlsSynchronizer::ReplaceMap:rnEither MapControl or PageLayoutControl are not initialized!");
  156.             //create a new instance of IMaps collection which is needed by the PageLayout
  157.             //创建一个PageLayout需要用到的,新的IMaps collection的实例
  158.             IMaps maps = new Maps();
  159.             //add the new map to the Maps collection
  160.             //把新的地图加到Maps collection里头去
  161.             maps.Add(newMap);
  162.             bool bIsMapActive = m_IsMapCtrlactive;
  163.             //call replace map on the PageLayout in order to replace the focus map
  164.             //we must call ActivatePageLayout, since it is the control we call 'ReplaceMaps'
  165.             //调用PageLayout的replace map来置换focus map
  166.             //我们必须调用ActivatePageLayout,因为它是那个我们可以调用"ReplaceMaps"的Control
  167.             this.ActivatePageLayout();
  168.             m_pageLayoutControl.PageLayout.ReplaceMaps(maps);
  169.             //assign the new map to the MapControl
  170.             //把新的地图赋给MapControl
  171.             m_mapControl.Map = newMap;
  172.             //reset the active tools
  173.             //重设active tools
  174.             m_pageLayoutActiveTool = null;
  175.             m_mapActiveTool = null;
  176.             //make sure that the last active control is activated
  177.             //确认之前活动的control被激活
  178.             if (bIsMapActive)
  179.             {
  180.                 this.ActivateMap();
  181.                 m_mapControl.ActiveView.Refresh();
  182.             }
  183.             else
  184.             {
  185.                 this.ActivatePageLayout();
  186.                 m_pageLayoutControl.ActiveView.Refresh();
  187.             }
  188.         }
  189.         /// <summary>
  190.         /// bind the MapControl and PageLayoutControl together by assigning a new joint focus map
  191.         /// 指定共同的Map来把MapControl和PageLayoutControl绑在一起
  192.         /// </summary>
  193.         /// <param name="mapControl"></param>
  194.         /// <param name="pageLayoutControl"></param>
  195.         /// <param name="activateMapFirst">true if the MapControl supposed to be activated first,如果MapControl被首先激活,则为true</param>
  196.         public void BindControls(IMapControl3 mapControl, IPageLayoutControl2 pageLayoutControl, bool activateMapFirst)
  197.         {
  198.             if (mapControl == null || pageLayoutControl == null)
  199.                 throw new Exception("ControlsSynchronizer::BindControls:rnEither MapControl or PageLayoutControl are not initialized!");
  200.             m_mapControl = MapControl;
  201.             m_pageLayoutControl = pageLayoutControl;
  202.             this.BindControls(activateMapFirst);
  203.         }
  204.         /// <summary>
  205.         /// bind the MapControl and PageLayoutControl together by assigning a new joint focus map
  206.         /// 指定共同的Map来把MapControl和PageLayoutControl绑在一起
  207.         /// </summary>
  208.         /// <param name="activateMapFirst">true if the MapControl supposed to be activated first,如果MapControl被首先激活,则为true</param>
  209.         public void BindControls(bool activateMapFirst)
  210.         {
  211.             if (m_pageLayoutControl == null || m_mapControl == null)
  212.                 throw new Exception("ControlsSynchronizer::BindControls:rnEither MapControl or PageLayoutControl are not initialized!");
  213.             //create a new instance of IMap
  214.             //创造IMap的一个实例
  215.             IMap newMap = new MapClass();
  216.             newMap.Name = "Map";
  217.             //create a new instance of IMaps collection which is needed by the PageLayout
  218.             //创造一个新的IMaps collection的实例,这是PageLayout所需要的
  219.             IMaps maps = new Maps();
  220.             //add the new Map instance to the Maps collection
  221.             //把新的Map实例赋给Maps collection
  222.             maps.Add(newMap);
  223.             //call replace map on the PageLayout in order to replace the focus map
  224.             //调用PageLayout的replace map来置换focus map
  225.             m_pageLayoutControl.PageLayout.ReplaceMaps(maps);
  226.             //assign the new map to the MapControl
  227.             //把新的map赋给MapControl
  228.             m_mapControl.Map = newMap;
  229.             //reset the active tools
  230.             //重设active tools
  231.             m_pageLayoutActiveTool = null;
  232.             m_mapActiveTool = null;
  233.             //make sure that the last active control is activated
  234.             //确定最后活动的control被激活
  235.             if (activateMapFirst)
  236.                 this.ActivateMap();
  237.             else
  238.                 this.ActivatePageLayout();
  239.         }
  240.         /// <summary>
  241.         ///by passing the application's toolbars and TOC to the synchronization class, it saves you the
  242.         ///management of the buddy control each time the active control changes. This method ads the framework
  243.         ///control to an array; once the active control changes, the class iterates through the array and 
  244.         ///calles SetBuddyControl on each of the stored framework control.
  245.         /// </summary>
  246.         /// <param name="control"></param>
  247.         public void AddFrameworkControl(object control)
  248.         {
  249.             if (control == null)
  250.                 throw new Exception("ControlsSynchronizer::AddFrameworkControl:rnAdded control is not initialized!");
  251.             m_frameworkControls.Add(control);
  252.         }
  253.         /// <summary>
  254.         /// Remove a framework control from the managed list of controls
  255.         /// </summary>
  256.         /// <param name="control"></param>
  257.         public void RemoveFrameworkControl(object control)
  258.         {
  259.             if (control == null)
  260.                 throw new Exception("ControlsSynchronizer::RemoveFrameworkControl:rnControl to be removed is not initialized!");
  261.             m_frameworkControls.Remove(control);
  262.         }
  263.         /// <summary>
  264.         /// Remove a framework control from the managed list of controls by specifying its index in the list
  265.         /// </summary>
  266.         /// <param name="index"></param>
  267.         public void RemoveFrameworkControlAt(int index)
  268.         {
  269.             if (m_frameworkControls.Count < index)
  270.                 throw new Exception("ControlsSynchronizer::RemoveFrameworkControlAt:rnIndex is out of range!");
  271.             m_frameworkControls.RemoveAt(index);
  272.         }
  273.         /// <summary>
  274.         /// when the active control changes, the class iterates through the array of the framework controls
  275.         ///  and calles SetBuddyControl on each of the controls.
  276.         /// </summary>
  277.         /// <param name="buddy">the active control</param>
  278.         private void SetBuddies(object buddy)
  279.         {
  280.             try
  281.             {
  282.                 if (buddy == null)
  283.                     throw new Exception("ControlsSynchronizer::SetBuddies:rnTarget Buddy Control is not initialized!");
  284.                 foreach (object obj in m_frameworkControls)
  285.                 {
  286.                     if (obj is IToolbarControl)
  287.                     {
  288.                         ((IToolbarControl)obj).SetBuddyControl(buddy);
  289.                     }
  290.                     else if (obj is ITOCControl)
  291.                     {
  292.                         ((ITOCControl)obj).SetBuddyControl(buddy);
  293.                     }
  294.                 }
  295.             }
  296.             catch (Exception ex)
  297.             {
  298.                 throw new Exception(string.Format("ControlsSynchronizer::SetBuddies:rn{0}", ex.Message));
  299.             }
  300.         }
  301.         #endregion
  302.     }
  303. }