主控件与鸟瞰控件的联动

Posted by 蒋波涛 7 April,2006 Views (8)Comment
两个MapControl控件,一个作为主控件,另一个作为鸟瞰控件,当主控件的视图变化时,鸟瞰控件的出现一个红色的框标识主控件的显示区域,如果在鸟瞰控件上点击,也会改变主控件的显示范围。

原理:由于两个控件载入的数据都是一样的,因此,主控件的视图范围Extent和鸟瞰控件红框的Envelope是一致的,两个控件尽管大小不一样,但视图范围一致。

代码:
Dim pMainMap As IMap
Dim pMainAV As IActiveView
Dim pOverMap As IMap
Dim pOverAV As IActiveView
Dim pOverGraCon As IGraphicsContainer
Dim pEnv As IEnvelope

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
pMainMap = AxMapControl1.Map
pMainAV = pMainMap
pOverMap = AxMapControl2.Map
pOverAV = pOverMap
pOverGraCon = pOverAV

'让鸟瞰控件中载入和主控件一样的地图
Dim iLayer As Integer
For iLayer = 0 To pMainMap.LayerCount - 1
pOverMap.AddLayer(pMainMap.Layer(iLayer))
Next
pOverAV.Extent = AxMapControl2.FullExtent
pOverAV.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
End Sub
------------------------------------------
Private Sub AxMapControl1_OnAfterScreenDraw(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterScreenDrawEvent) Handles AxMapControl1.OnAfterScreenDraw
'两个控件保持保持一致
pEnv = pMainAV.Extent

Dim pOverEle As IFillShapeElement
pOverEle = getEnvEle(pEnv)

'首先删除鸟瞰控件中的所有Element,为什么?大家可以想想
pOverGraCon.DeleteAllElements()
pOverGraCon.AddElement(pOverEle, 0)
'刷新鸟瞰控件视图
pOverAV.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
End Sub
-------------------------------------------
Private Sub AxMapControl2_OnMouseDown(ByVal sender As System.Object, ByVal e As ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent) Handles AxMapControl2.OnMouseDown
Dim pPt As IPoint
pPt = New Point
pPt.PutCoords(e.mapX, e.mapY)

'改变主控件的视图范围
pEnv.CenterAt(pPt)
pMainAV.Extent = pEnv

pMainAV.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)
End Sub
---------------------------------------------
' 产生颜色的函数
Private Function getEnvEle(ByVal pEnv As IEnvelope) As IFillShapeElement
Dim pEle As IElement
Dim pFillShapeEle As IFillShapeElement
pFillShapeEle = New RectangleElement
pEle = pFillShapeEle

'颜色产生器
Dim pColor As IRgbColor
pColor = New RgbColor
pColor.Red = 255
pColor.Green = 0
pColor.Blue = 0
pColor.Transparency = 255

'线符号
Dim pLineSym As ISimpleLineSymbol
pLineSym = New SimpleLineSymbol
pLineSym.Color = pColor
pLineSym.Style = esriSimpleLineStyle.esriSLSSolid
pLineSym.Width = 1

'填充符号
Dim pFillSym As IFillSymbol
pFillSym = New SimpleFillSymbol
pColor.Transparency = 0
pFillSym.Color = pColor
pFillSym.Outline = pLineSym

pEle.Geometry = pEnv
pFillShapeEle.Symbol = pFillSym
Return pFillShapeEle
End Function

Related Items

Categories : ArcObjects Tags :
Comments
2006-4-11 20:29:28

楼主的这个方法有很大的局限性阿

Posted by arcgis Gravatar Icon

2006-4-11 22:03:24

愿闻其详

Posted by 蒋波涛 Gravatar Icon

2006-4-19 17:45:35

楼主 能不能直接通过移动mapcontol2上的envelope来定位mapcontrol1,不用定点的方法

Posted by 令狐 Gravatar Icon

2006-4-19 21:45:03

当然可以,但是我觉得自己的这种方法最简单,在鸟瞰控件上点击一个点后,主控件的视图改变,随之引起鸟瞰控件上的红色矩形框位置发生变化。如果使用你的方法,需要寻找到这个红色框,然后改变它的envelope,这个代码比我的多很多。

Posted by 蒋波涛 Gravatar Icon

2006-4-20 22:44:19

我是通过在鸟瞰控件拉一个矩形框来改变主控件视图的。

Posted by nhlzx Gravatar Icon

2006-12-12 13:40:14

请问楼主,在定义变量的时候是否应当添加一些引用?是什么?谢谢!

Posted by aling Gravatar Icon

2007-7-16 11:23:27

我在arcmap自己做了一个鹰眼但是每次关掉arcmap的时候都会有错,以前说是mapcontrol的内存处理的bug但是在9.2还是有同样的问题,什么原因可以提供些指导吗?

Posted by hel Gravatar Icon

2008-4-24 16:51:41

最合适的方法,写成控件,用连接点技术与MapControl绑定一起。好处一,重复利用;好处二,模块独立,易于维护,好处三,容易使用。

Posted by gzstyxb Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档