【转】MapControl和PageLayoutControl的同步

    可以使用三种方式实现MapControl和PageLayoutControl的同步: 1、监听由MapControl和PageLayoutControl触发的事件,并在事件发生时对另外一个控件中的地图对象做相同的改变。例如,当向MapControl中的地图对象中添加一个图层时,将触发IActiveViewEvents.ItemAdded事件,要保证两个控件之间的同步,需要用程序向PageLayoutControl中的地图对象添加一个相同的图层。不推荐使用这种方式,因为无论是MapControl还是PageLayoutControl都有很多的事件需要监听,实现起来,会十分麻烦; 2、可以在两个控件视图相互切换时,使用 的Copy()方法来复制每个图层的状态,并使用Overwrite()方法覆盖切换后将显示的控件视图中的图层。在PageLayoutControl 封装的PageLayout对象中,每个Map对象都置于对应的MapFrame中,因此,其IMap.IsFramed属性值为True;而 MapControl中的Map对象则没有被置于MapFrame中,因此,当从PageLayoutControl切换至MapControl时,在用 PageLayoutControl中的地图对象覆盖MapControl中的地图对象前,必须把地图对象的IMap.IsFramed属性值设为 false。这种方式适用于将地图从PageLayoutControl拷贝至MapControl的情况,但不适用于将地图对象从MapControl 拷贝至PageLayoutControl的情况,因为PageLayoutControl中管理的不仅仅包含Map对象,同时也管理着若干个 MapFrame以及实现了IMapSurround接口的对象(比如指北针、比例尺等)。每个MapSurround对象都保存着一个指向Map对象的 指针,如果用MapControl中的Map覆盖了PageLayoutControl中的Map对象,那么PageLayoutControl中的 MapSurround对象就不再指向一个有效的地图对象,从而产生错误; 3、推荐的方法是使PageLayoutControl和 MapControl中的Map对象指向同一个地图实例,实现的方式是使用MapDocument对象加载数据,然后使用 PageLayoutControl的ReplaceMaps()方法和设置MapControl的Map属性,来指向MapDocument中的同一个 Map对象。其中,ReplaceMaps()方法接收IMaps类型的对象,AE中没有定义IMaps接口,这需要由用户自己创建自定义类实现该接口。 为保证系统中只有一个ActiveView对象,当从PageLayoutControl切换至MapControl时,需要先调用 PageLayoutControl的DeActivate方法,再调用MapControl的Activate方法;从MapControl切换至 PageLayoutControl时,先调用MapControl的DeActivate方法,再调用PageLayoutControl的 Activate方法。如果没有这样做,将导致地图闪烁的现象发生,实例代码可在http://edndoc.esri.com/arcobjects/9.2/NET/667d20df-d51e-4766-8ca0-c8b0cb924e5d.htm下载。此外,也可以不使用ReplaceMaps()方法,而采用下面的实例代码实现MapControl和PageLayoutControl指向相同的地图对象实例:| (1)从PageLayoutControl切换至MapControl Me.pageLayoutView.ActiveView.Deactivate() m_pMapDoc.SetActiveView(m_pMapDoc.Map(0)) mapControlMainView.ActiveView.Activate(Me.mapControlMainView.hWnd) Me.mapControlMainView.Map = m_pMapDoc.Map(0) (2)从MapControl切换至PageLayoutControl Me.mapControlMainView.ActiveView.Deactivate() m_pMapDoc.SetActiveView(m_pMapDoc.PageLayout) Me.pageLayoutView.ActiveView.Activate(Me.pageLayoutView.hWnd) Me.pageLayoutView.PageLayout = m_pMapDoc.PageLayout
posted @ 2012-07-16 18:56  adodo1  Views(134)  Comments(0Edit  收藏  举报