网上看到的代码,都是一个模样,经过不断调试,无意中效果就可以了.主要是在"鼠标拖动的时候",网上的代码的鹰眼效果,感觉坑爹死了,闪烁超级严重.主要原因是鼠标拖动的时候,进行时时更新.
我在"天地图"上,它实现的效果也是鼠标拖动放开后才更新.以下是我对网上的代码进行稍微的改动:
主视图:
#region 主视图事件.
//同步鹰眼视图和主视图.
private void map_main_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e) {
mapCtrl_view.ClearLayers();
for (int i = 0; i < mapCtrl_main.LayerCount; i++) mapCtrl_view.AddLayer(mapCtrl_main.get_Layer(i));
mapCtrl_view.Extent = mapCtrl_main.FullExtent;
mapCtrl_main.Refresh();
}
//画轮廓.
private void map_main_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) {
DrawSymbol(sender, (ESRI.ArcGIS.Geometry.IEnvelope)e.newEnvelope);
}
#endregion
辅助方法:
1 /// <summary>
2 /// 返回颜色.
3 /// </summary>
4 /// <param name="rgb">rgb的值</param>
5 /// <param name="transparency">透明度[0,255](0为全透明)</param>
6 /// <returns>颜色对象.</returns>
7 ESRI.ArcGIS.Display.IRgbColor ColorPaint(int rgb, byte transparency) {
8 ESRI.ArcGIS.Display.IRgbColor rgbColor = new ESRI.ArcGIS.Display.RgbColorClass();
9 rgbColor.RGB = rgb;
10 rgbColor.Transparency = transparency;
11 return rgbColor;
12 }
13
14 /// <summary>
15 /// 画轮廓.
16 /// </summary>
17 /// <param name="sender"></param>
18 /// <param name="e">根据IEnvelope对象画轮廓.</param>
19 void DrawSymbol(object sender, ESRI.ArcGIS.Geometry.IEnvelope e) {
20 ESRI.ArcGIS.Carto.IGraphicsContainer hawkGC = (ESRI.ArcGIS.Carto.IGraphicsContainer)mapCtrl_view.Map;
21 ESRI.ArcGIS.Carto.IActiveView aView = (ESRI.ArcGIS.Carto.IActiveView)hawkGC;
22 hawkGC.DeleteAllElements();
23
24 ESRI.ArcGIS.Carto.IElement recEle = (ESRI.ArcGIS.Carto.IElement)new ESRI.ArcGIS.Carto.RectangleElementClass();
25 recEle.Geometry = e;
26 ESRI.ArcGIS.Display.ISimpleLineSymbol outLine = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
27 outLine.Color = ColorPaint(255, 255);
28 outLine.Width = 2;
29
30 //填充样式.
31 ESRI.ArcGIS.Display.ISimpleFillSymbol fillSym = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();
32 fillSym.Color = ColorPaint(255, 0);
33 fillSym.Outline = outLine;
34
35 ESRI.ArcGIS.Carto.IFillShapeElement fillShape = (ESRI.ArcGIS.Carto.IFillShapeElement)recEle;
36 fillShape.Symbol = fillSym;
37 hawkGC.AddElement((ESRI.ArcGIS.Carto.IElement)fillShape, 0);
38 aView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, null);
39 }
鹰眼视图:
1 #region 鹰眼事件.
2 private void map_view_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) {
3 if (mapCtrl_main.LayerCount < 0) return;
4 if (e.button == 1) { //点选.
5 ESRI.ArcGIS.Geometry.IPoint ptNew = new ESRI.ArcGIS.Geometry.PointClass();
6 ptNew.PutCoords(e.mapX, e.mapY);
7 }
8 else if (e.button == 2) //右键框选.
9 {
10 interEnvelope = mapCtrl_view.TrackRectangle();
11 //记录感兴趣区.
12 mapCtrl_main.Extent = interEnvelope;
13 }
14 mapCtrl_main.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, null, null);
15 }
16
17 private void map_view_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) {
18 if (e.button == 1 && interEnvelope != null) {
19 //鼠标移动,轮廓跟着变,但是主视图不更新,直到鼠标放开.
20 interEnvelope.PutCoords(e.mapX - interEnvelope.Width / 2, e.mapY - interEnvelope.Height / 2, e.mapX + interEnvelope.Width / 2, e.mapY + interEnvelope.Height / 2);
21 DrawSymbol(sender, interEnvelope);
22 }
23 }
24
25 private void map_view_OnMouseUp(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseUpEvent e) {
26 //鼠标放开时同步更新主视图,和map_view_OnMouseMove搭配.
27 ESRI.ArcGIS.Geometry.IPoint ptNew = new ESRI.ArcGIS.Geometry.PointClass();
28 ptNew.PutCoords(e.mapX, e.mapY);
29 mapCtrl_main.CenterAt(ptNew);
30 mapCtrl_main.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, null, null);
31 }
32 #endregion