代码中主视图为Mapcontrol1,鹰眼视图为MapControl2。
主要利用了Envelope进行视图范围传递,从而控制视图同步等。
代码如下:
几个变量声明 :
//变量
IMapDocument pMapDocument = new MapDocumentClass();
IEnvelope pEn = new EnvelopeClass();
object oFillobject = new object();
private void CreateOverviewSymbol(){
IRgbColor iRgb = new RgbColorClass();
iRgb.RGB = 255;
ILineSymbol pOutline = new SimpleLineSymbolClass();
pOutline.Color = iRgb;
pOutline.Width = 2.3;
ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();
pSimpleFillSymbol.Outline = pOutline;
pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow;
oFillobject = pSimpleFillSymbol;
}
控制拖动变量:
private IMoveEnvelopeFeedback pSmallViewerEnvelope;//鹰眼小地图的红框,IMoveEnvelopeFeedback,用来移动Envelope的接口
private IPoint pSmallViewerMouseDownPt;//拖动时鼠标落点
private bool isTrackingSmallViewer = false; //标识是否在拖动
static int moveCount = 0;//记录移动的个数,为移动过程中显示红框用。axMapControl1_OnMapReplaced事件:
axMapControl2.LoadMxFile(axMapControl1.DocumentFilename);axMapControl1_OnExtentUpdated事件:
pEn = e.newEnvelope as IEnvelope;
axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);axMapControl1_OnAfterDraw:
esriViewDrawPhase viewDrawPhase = (esriViewDrawPhase)e.viewDrawPhase;
if (viewDrawPhase == esriViewDrawPhase.esriViewForeground){
axMapControl2.DrawShape(pEn, ref oFillobject);
}
axMapControl2_OnMouseDown:
if(e.button==1)//左键画红框{
pEn = axMapControl2.TrackRectangle();
axMapControl1.Extent = pEn;
axMapControl2.DrawShape(pEn, ref oFillobject);
if (e.button == 2)//右键拖动红框
{
pSmallViewerMouseDownPt = new PointClass();
pSmallViewerMouseDownPt.PutCoords(e.mapX, e.mapY);
axMapControl1.CenterAt(pSmallViewerMouseDownPt);
isTrackingSmallViewer = true;
if (pSmallViewerEnvelope == null)
{
pSmallViewerEnvelope = new MoveEnvelopeFeedbackClass();
pSmallViewerEnvelope.Display = axMapControl2.ActiveView.ScreenDisplay;
pSmallViewerEnvelope.Symbol = (ISymbol)oFillobject;
}
pSmallViewerEnvelope.Start(pEn, pSmallViewerMouseDownPt);
axMapControl2_OnMouseMove:
if (isTrackingSmallViewer){
moveCount++;
if (moveCount % 4 == 0)//因为一刷新,红框就没了。所以每移动4次就刷新一下,保持红框的连续性。
axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);
pSmallViewerMouseDownPt.PutCoords(e.mapX, e.mapY);
pSmallViewerEnvelope.MoveTo(pSmallViewerMouseDownPt);
}
axMapControl2_OnMouseUp:
if (pSmallViewerEnvelope != null){
pEn = pSmallViewerEnvelope.Stop();
axMapControl1.Extent = pEn;
isTrackingSmallViewer = false;
}
Form初始化:
axMapControl1.LoadMxFile(@"load data");
pEn = axMapControl1.Extent;//鹰眼红框初始化
CreateOverviewSymbol();经过测试可以实现鹰眼中画红框和拖动功能。
现在存在问题是,拖动功能还不太完善,抓紧研究,有了结果在贴上来。
其中,拖动部分思路即代码来自ESRI中国社区AE版。
本文介绍如何使用VS2005与ArcEngine 9.2实现地图鹰眼功能,包括鼠标左键绘制红色框选区域及右键拖动控制。通过Envelope对象传递视图范围,确保主视图与鹰眼视图同步更新。
817

被折叠的 条评论
为什么被折叠?



