首页 > 代码库 > Arcgis Engine - 鹰眼(减少闪烁)
Arcgis Engine - 鹰眼(减少闪烁)
网上看到的代码,都是一个模样,经过不断调试,无意中效果就可以了.主要是在"鼠标拖动的时候",网上的代码的鹰眼效果,感觉坑爹死了,闪烁超级严重.主要原因是鼠标拖动的时候,进行时时更新.
我在"天地图"上,它实现的效果也是鼠标拖动放开后才更新.以下是我对网上的代码进行稍微的改动:
主视图:
#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
Arcgis Engine - 鹰眼(减少闪烁)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。