C#AE面积测量

传入AxmapControl参数即可实现实时面积测量

代码如下:


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AxESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;

namespace PartOfJRSpace
{
    public class MeasureArea
    {
        //地图面板
        AxMapControl myMapControl;
        //地图面板容器
        IGraphicsContainer g;
        //点集
        IPointCollection pAreaPointCol = new MultipointClass();
        //画线
        NewLineFeedbackClass m_NewLineFeedback;
        //线段起始点
        IPoint starPoint;
        //第一个点
        IPoint firstPoint;
        //面积显示标签
        IElement measureAreaText;
        //动态连接线
        IElement firstPointToLast,lastLine;
        //连接线标签
        IElement firstPointToLastText;
        //连接线标签
        IElement moveText;
        public MeasureArea(AxMapControl pMapControl)
        {
            myMapControl = pMapControl;
            myMapControl.OnMouseDown += new IMapControlEvents2_OnMouseDownEventHandler(myMapControl_OnMouseDown);
            myMapControl.OnDoubleClick += new IMapControlEvents2_OnDoubleClickEventHandler(myMapControl_OnDoubleClick);
            myMapControl.OnMouseMove += new IMapControlEvents2_OnMouseMoveEventHandler(myMapControl_OnMouseMove);
            g = myMapControl.Map as IGraphicsContainer;
        }

        private void myMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (m_NewLineFeedback == null)
            {
                return;
            }
            IPoint pt = new PointClass();
            pt.X = e.mapX;
            pt.Y = e.mapY;
            
            if (pAreaPointCol.PointCount==1)
            {
                m_NewLineFeedback.MoveTo(pt);
                return;
            }

            ILine laLine = new LineClass();
            laLine.PutCoords(starPoint, pt);
            #region//动态连接线starTolast
            try
            {
                object missing = Type.Missing;

                ISegmentCollection segColl = new PolylineClass();

                segColl.AddSegment(laLine as ISegment, ref missing, ref missing);
                if (lastLine != null)
                {
                    g.DeleteElement(lastLine);
                    myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, lastLine, null);
                }

                lastLine = CreateElement(segColl as IPolyline);

                g.AddElement(lastLine, 0);

                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, lastLine, null);

            }
            catch
            {
                throw;
            }
            #endregion

 

            //连接起点和终点
            ILine firstToLastLine = new LineClass();
            firstToLastLine.PutCoords(firstPoint, pt);

            #region 动态连接线
            try
            {
                object missing = Type.Missing;

                ISegmentCollection segColl = new PolylineClass();

                segColl.AddSegment(firstToLastLine as ISegment, ref missing, ref missing);

                //删除上一个连接线
                if (firstPointToLast != null)
                {
                    g.DeleteElement(firstPointToLast);
                    //myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLast, null);
                }

                firstPointToLast = CreateElement(segColl as IPolyline);

                g.AddElement(firstPointToLast, 0);

                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLast, null);

            }
            catch
            {
                throw;
            }
            #endregion

            #region 动态连接线长度
            try
            {
                double angle = firstToLastLine.Angle;
                if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180
                    angle += Math.PI;

                //标注点Y值偏移量
                double d_OffsetY = myMapControl.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9);

                //标注点
                double d_CenterX = (firstPoint.X + pt.X) / 2;
                double d_CenterY = (firstPoint.Y + pt.Y) / 2 + d_OffsetY; //向上偏移

                IPoint labelPt = new PointClass();
                labelPt.PutCoords(d_CenterX, d_CenterY);
                //删除上一个长度标签
                if (firstPointToLastText != null)
                {
                    g.DeleteElement(firstPointToLastText);
                    //刷新
                    myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLastText, null);
                }
                ITextElement txtElement = CreateTextElement(firstToLastLine.Length.ToString("0.00") + GetMapLenUnit(myMapControl.Map.MapUnits));
                firstPointToLastText = txtElement as IElement;
                firstPointToLastText.Geometry = labelPt;
                object oElement = (object)firstPointToLastText;
                //根据角度旋转
                TransformByRotate(ref oElement, labelPt, angle);
                ////添加到GraphicsContainer
                g.AddElement(firstPointToLastText, 0);
                //刷新
                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLastText, null);

            }
            catch
            {
                throw;
            }
            #endregion

            #region 计算单线的长度,并将结果显示在单线中点偏上上面
            try
            {
                ILine line = new LineClass();
                line.PutCoords(starPoint, pt);
                //删除上一个连接线
                if (moveText != null)
                {
                    g.DeleteElement(moveText);
                    //刷新
                    myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, moveText, null);
                }
                double angle = line.Angle;
                if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180
                    angle += Math.PI;

                //标注点Y值偏移量
                double d_OffsetY = myMapControl.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9);

                //标注点
                double d_CenterX = (starPoint.X + pt.X) / 2;
                double d_CenterY = (starPoint.Y + pt.Y) / 2 + d_OffsetY; //向上偏移

                IPoint labelPt = new PointClass();
                labelPt.PutCoords(d_CenterX, d_CenterY);

                ITextElement txtElement = CreateTextElement(line.Length.ToString("0.00") + GetMapLenUnit(myMapControl.Map.MapUnits));

                moveText = txtElement as IElement;
                moveText.Geometry = labelPt;
                object oElement = (object)moveText;

                //根据角度旋转
                TransformByRotate(ref oElement, labelPt, angle);
                ////添加到GraphicsContainer
                g.AddElement(moveText, 0);
                //刷新
                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, moveText, null);

            }
            catch
            {
                throw;
            }
            #endregion

        }
        private void myMapControl_OnDoubleClick(object sender, IMapControlEvents2_OnDoubleClickEvent e)
        {
            m_NewLineFeedback.Stop();
            m_NewLineFeedback = null;
            pAreaPointCol.RemovePoints(0, pAreaPointCol.PointCount);
            //删除g中的所有要素
            g.DeleteAllElements();
            starPoint=null;
            firstPoint=null;
            lastLine = null;
            measureAreaText = null;
            firstPointToLast = null;
            firstPointToLastText = null;
            //刷新
            myMapControl.ActiveView.Refresh();
        }
        private void myMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            if (e.button == 1)
            {
                
                IPoint pt = new PointClass();
                pt.X = e.mapX;
                pt.Y = e.mapY;
                pAreaPointCol.AddPoint(pt);

                #region 绘制结点
                try
                {
                    pt.X = e.mapX;
                    pt.Y = e.mapY;
                    IElement pointElement = CreateElement(pt);
                    //
                    g.AddElement(pointElement, 0);

                    myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pointElement, null);
                }
                catch
                {
                    throw;
                }
                #endregion

                //画线
                if (m_NewLineFeedback == null)
                {
                    m_NewLineFeedback = new NewLineFeedbackClass();
                    ISimpleLineSymbol pLine = m_NewLineFeedback.Symbol as ISimpleLineSymbol;
                    RgbColorClass pColor = new RgbColorClass();
                    pColor.Red = 255;
                    pColor.Green = 0;
                    pColor.Blue = 0;
                    pLine.Color = pColor;
                    m_NewLineFeedback.Display = myMapControl.ActiveView.ScreenDisplay;
                    m_NewLineFeedback.Start(pt);
                    firstPoint = pt;
                }
                else
                {
                    m_NewLineFeedback.AddPoint(pt);
                }
                if (starPoint == null)
                {

                }
                else
                {
                    ILine line = new LineClass();
                    line.PutCoords(starPoint, pt);
                    if (lastLine != null)
                    {
                        g.DeleteElement(lastLine);
                        myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, lastLine, null);
                        lastLine = null;
                    }
                    #region 绘制轨迹线
                    try
                    {
                        object missing = Type.Missing;

                        ISegmentCollection segColl = new PolylineClass();

                        segColl.AddSegment(line as ISegment, ref missing, ref missing);

                        IElement traceElement = CreateElement(segColl as IPolyline);

                        g.AddElement(traceElement, 0);

                        myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, traceElement, null);

                    }
                    catch
                    {
                        throw;
                    }
                    #endregion

                    #region 计算单线的长度,并将结果显示在单线中点偏上上面
                    try
                    {
                        double angle = line.Angle;
                        if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180
                            angle += Math.PI;

                        //标注点Y值偏移量
                        double d_OffsetY = myMapControl.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9);

                        //标注点
                        double d_CenterX = (starPoint.X + pt.X) / 2;
                        double d_CenterY = (starPoint.Y + pt.Y) / 2 + d_OffsetY; //向上偏移

                        IPoint labelPt = new PointClass();
                        labelPt.PutCoords(d_CenterX, d_CenterY);

                        ITextElement txtElement = CreateTextElement(line.Length.ToString("0.00") + GetMapLenUnit(myMapControl.Map.MapUnits));

                        IElement labelelement = txtElement as IElement;
                        labelelement.Geometry = labelPt;
                        object oElement = (object)labelelement;

                        //根据角度旋转
                        TransformByRotate(ref oElement, labelPt, angle);
                        ////添加到GraphicsContainer
                        g.AddElement(labelelement, 0);
                        //刷新
                        myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, labelelement, null);

                    }
                    catch
                    {
                        throw;
                    }
                    #endregion

                    if (pAreaPointCol.PointCount >= 3)
                    {
                        //连接起点和终点
                        ILine firstToLastLine = new LineClass();
                        firstToLastLine.PutCoords(firstPoint,pt);

                        #region 动态连接线
                        try
                        {
                            object missing = Type.Missing;

                            ISegmentCollection segColl = new PolylineClass();

                            segColl.AddSegment(firstToLastLine as ISegment, ref missing, ref missing);
                            //删除上一个连接线
                            if (firstPointToLast != null)
                            {
                                g.DeleteElement(firstPointToLast);
                                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLast, null);
                            }

                            firstPointToLast = CreateElement(segColl as IPolyline);

                            g.AddElement(firstPointToLast, 0);

                            myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLast, null);

                        }
                        catch
                        {
                            throw;
                        }
                        #endregion

                        #region 动态连接线长度
                        try
                        {
                            double angle = firstToLastLine.Angle;
                            if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180
                                angle += Math.PI;

                            //标注点Y值偏移量
                            double d_OffsetY = myMapControl.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9);

                            //标注点
                            double d_CenterX = (firstPoint.X + pt.X) / 2;
                            double d_CenterY = (firstPoint.Y + pt.Y) / 2 + d_OffsetY; //向上偏移

                            IPoint labelPt = new PointClass();
                            labelPt.PutCoords(d_CenterX, d_CenterY);
                            if (firstPointToLastText!=null)
                            {
                                g.DeleteElement(firstPointToLastText);
                                //刷新
                                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLastText, null);
                            }
                            ITextElement txtElement = CreateTextElement(firstToLastLine.Length.ToString("0.00") + GetMapLenUnit(myMapControl.Map.MapUnits));
                            firstPointToLastText = txtElement as IElement;
                            firstPointToLastText.Geometry = labelPt;
                            object oElement = (object)firstPointToLastText;
                            //根据角度旋转
                            TransformByRotate(ref oElement, labelPt, angle);
                            ////添加到GraphicsContainer
                            g.AddElement(firstPointToLastText, 0);
                            //刷新
                            myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, firstPointToLastText, null);

                        }
                        catch
                        {
                            throw;
                        }
                        #endregion


                        IPointCollection pPointCol = new Polygon();
                        IPolygon pPolygon = new PolygonClass();
                        for (int i = 0; i < pAreaPointCol.PointCount; i++)
                        {
                            pPointCol.AddPoint(pAreaPointCol.Point[i]);
                        }
                        pPolygon = pPointCol as IPolygon;
                        if (pPolygon != null)
                        {
                            //使封闭
                            pPolygon.Close();
                            IArea pArea = pPolygon as IArea;
                            //几何中心点
                            IPoint iPnt = pArea.Centroid;
                            ITextElement txtElement = CreateTextElement(Math.Abs(pArea.Area).ToString("0.00") + GetMapAreaUnit(myMapControl.Map.MapUnits));

                            if (measureAreaText != null)
                            {
                                g.DeleteElement(measureAreaText);
                                myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, measureAreaText, null);
                            }

                            //文字注记
                            measureAreaText = txtElement as IElement;
                            measureAreaText.Geometry = iPnt;
                            g.AddElement(measureAreaText, 0);
                            myMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, measureAreaText, null);
                        }
                    }

                }
                starPoint = pt;
            }
        }

        /// <summary>
        /// 按指定的角度旋转
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="originPt"></param>
        /// <param name="rotate"></param>
        private void TransformByRotate(ref object obj, IPoint originPt, double rotate)
        {
            if (obj == null && originPt == null)
                return;
            try
            {
                ITransform2D transform2D = obj as ITransform2D;
                if (transform2D == null)
                    return;
                transform2D.Rotate(originPt, rotate);

            }
            catch
            {
                throw;
            }
        }


        /// <summary>
        /// 绘制几何图形
        /// </summary>
        /// <param name="geoType"></param>
        /// <param name="geometry"></param>
        /// <returns></returns>
        private ESRI.ArcGIS.Carto.IElement CreateElement(ESRI.ArcGIS.Geometry.IGeometry geometry)
        {
            IElement element = null;
            try
            {
                switch (geometry.GeometryType)
                {
                    case esriGeometryType.esriGeometryPolygon://设置Polygon面
                        IRgbColor polygonRGB = new RgbColorClass();
                        polygonRGB.Blue = 255;
                        polygonRGB.Red = 179;
                        polygonRGB.Green = 196;
                        polygonRGB.Transparency = (byte)0;

                        IFillSymbol polygonFill = new SimpleFillSymbolClass();
                        polygonFill.Color = polygonRGB;

                        IFillShapeElement fillShapeElement = new PolygonElementClass();
                        fillShapeElement.Symbol = polygonFill;
                        element = fillShapeElement as IElement;


                        element.Geometry = geometry;


                        break;
                    case esriGeometryType.esriGeometryPolyline://Polyline线
                        ISimpleLineSymbol simpleLineSymbol = m_NewLineFeedback.Symbol as ISimpleLineSymbol;

                        ILineElement lineElement = new LineElementClass();
                        lineElement.Symbol = simpleLineSymbol as ILineSymbol;
                        element = lineElement as IElement;
                        element.Geometry = geometry;
                        break;
                    case esriGeometryType.esriGeometryPoint://设置结点符号
                        IRgbColor pRGB = new RgbColorClass();
                        pRGB.Red = 255;
                        pRGB.Green = 0;
                        pRGB.Blue = 0;
                        ISimpleMarkerSymbol pSimpleMarkSymbol = new SimpleMarkerSymbolClass();
                        pSimpleMarkSymbol.Color = pRGB as IColor;
                        pSimpleMarkSymbol.Size = 2;
                        pSimpleMarkSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;

                        IMarkerElement pMarkerElement = new MarkerElementClass();
                        pMarkerElement.Symbol = pSimpleMarkSymbol as IMarkerSymbol;
                        element = pMarkerElement as IElement;
                        element.Geometry = geometry as IGeometry;
                        break;
                }
            }
            catch
            {
                throw;
            }
            return element;
        }

        /// <summary>
        /// 创建一个TextElement
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        private ITextElement CreateTextElement(string text)
        {
            //创建一个TextSymbol
            ITextSymbol txtSymbol = new TextSymbolClass();

            //设置字体
            Font dispFont = new Font("Arial", 10, FontStyle.Regular);
            txtSymbol.Font = (stdole.IFontDisp)ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont(dispFont);

            //设置属性
            txtSymbol.Color = TransColorToAEColor(Color.Red); //颜色

            //创建一个TextElement
            ITextElement txtElement = new TextElementClass();
            txtElement.Symbol = txtSymbol;
            txtElement.Text = text;

            return txtElement;
        }


        /// <summary>
        /// 获取当前地图的面积单位
        /// </summary>
        /// <param name="pEsriUnits"></param>
        /// <returns></returns>
        private string GetMapAreaUnit(esriUnits pEsriUnits)
        {
            string sMapUnits = string.Empty;
            switch (pEsriUnits)
            {
                case esriUnits.esriCentimeters:
                    sMapUnits = "平方厘米";
                    break;
                case esriUnits.esriDecimalDegrees:
                    sMapUnits = "十进制度";
                    break;
                case esriUnits.esriDecimeters:
                    sMapUnits = "分米";
                    break;
                case esriUnits.esriFeet:
                    sMapUnits = "尺";
                    break;
                case esriUnits.esriInches:
                    sMapUnits = "英寸";
                    break;
                case esriUnits.esriKilometers:
                    sMapUnits = "平方千米";
                    break;
                case esriUnits.esriMeters:
                    sMapUnits = "平方米";
                    break;
                case esriUnits.esriMiles:
                    sMapUnits = "英里";
                    break;
                case esriUnits.esriMillimeters:
                    sMapUnits = "毫米";
                    break;
                case esriUnits.esriNauticalMiles:
                    sMapUnits = "海里";
                    break;
                case esriUnits.esriPoints:
                    sMapUnits = "点";
                    break;
                case esriUnits.esriUnitsLast:
                    sMapUnits = "UnitsLast";
                    break;
                case esriUnits.esriUnknownUnits:
                    sMapUnits = "";
                    break;
                case esriUnits.esriYards:
                    sMapUnits = "码";
                    break;
                default:
                    break;
            }

 

            return sMapUnits;
        }

        /// <summary>
        /// 获取当前地图的长度单位
        /// </summary>
        /// <param name="pEsriUnits"></param>
        /// <returns></returns>
        private string GetMapLenUnit(esriUnits pEsriUnits)
        {
            string sMapUnits = string.Empty;
            switch (pEsriUnits)
            {
                case esriUnits.esriCentimeters:
                    sMapUnits = "厘米";
                    break;
                case esriUnits.esriDecimalDegrees:
                    sMapUnits = "十进制度";
                    break;
                case esriUnits.esriDecimeters:
                    sMapUnits = "分米";
                    break;
                case esriUnits.esriFeet:
                    sMapUnits = "尺";
                    break;
                case esriUnits.esriInches:
                    sMapUnits = "英寸";
                    break;
                case esriUnits.esriKilometers:
                    sMapUnits = "千米";
                    break;
                case esriUnits.esriMeters:
                    sMapUnits = "米";
                    break;
                case esriUnits.esriMiles:
                    sMapUnits = "英里";
                    break;
                case esriUnits.esriMillimeters:
                    sMapUnits = "毫米";
                    break;
                case esriUnits.esriNauticalMiles:
                    sMapUnits = "海里";
                    break;
                case esriUnits.esriPoints:
                    sMapUnits = "点";
                    break;
                case esriUnits.esriUnitsLast:
                    sMapUnits = "UnitsLast";
                    break;
                case esriUnits.esriUnknownUnits:
                    sMapUnits = "";
                    break;
                case esriUnits.esriYards:
                    sMapUnits = "码";
                    break;
                default:
                    break;
            }

 

            return sMapUnits;
        }


        /// <summary>
        /// 将系统颜色转换为IColor
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        ESRI.ArcGIS.Display.IColor TransColorToAEColor(Color color)
        {
            IRgbColor rgb = new RgbColorClass();
            rgb.RGB = color.R + color.G * 256 + color.B * 65536;
            return rgb as IColor;
        }


        /// <summary>
        /// 关闭测量工具,并清除所绘制的内容
        /// </summary>
        public void Close()
        {
            m_NewLineFeedback = null;
            pAreaPointCol.RemovePoints(0, pAreaPointCol.PointCount);
            //删除g中的所有要素
            g.DeleteAllElements();
            starPoint = null;
            firstPoint = null;
            lastLine = null;
            measureAreaText = null;
            firstPointToLast = null;
            firstPointToLastText = null;
            //刷新
            myMapControl.ActiveView.Refresh();
            //去除地图绑定的事件
            myMapControl.OnMouseDown -= new IMapControlEvents2_OnMouseDownEventHandler(myMapControl_OnMouseDown);
            //去除鼠标双击事件
            myMapControl.OnDoubleClick -= new IMapControlEvents2_OnDoubleClickEventHandler(myMapControl_OnDoubleClick);
            //去除鼠标移动事件
            myMapControl.OnMouseMove -= new IMapControlEvents2_OnMouseMoveEventHandler(myMapControl_OnMouseMove);
        }


    }
}
 

客户最近打电话过来,说我们的软件在量距离的时候不能平移地图。我们的软件是使用ArcEngine来开发的,在网上输入关键字“arcengine 距离测量”,可以搜索到一大堆内容基本相似的文章或代码,基本上都是采用INewLineFeedback来实现的,我们的软件也是使用此种方法。方法大致如下:写一个距离测量工具,继承自BaseTool,在该类中使用INewLineFeedback动态绘制多段折线,最后转化为Element添加到地图上。如果要增加平移功能,我们仿造ArcMap使用鼠标中键平移,在OnMouseDown、OnMouseMove、OnMouseUp事件中增加判断鼠标中键的语句,然后分别使用PanStart、PanMoveTo、PanStop实现地图的平移。 此时,出现了一个新问题,一旦移动地图后,之前使用INewLineFeedback绘制的线完全乱了方寸,有一部分线丢失了。之后又发现一个更可笑的问题,在绘制的过程中,如果使用alt+tab键切换到其它窗口,然后再切换回地图窗口的时候,会多出一条线,INewLineFeedback把切换窗口前的鼠标位置记录了下来。 对于这个问题,我使用ArcMap的测量工具检查了一下,发现不存在上述问题。但是INewLineFeedback为什么会产生这个bug,难道是本人的使用方法不对。在网上搜了一下其他类似代码进行测试,都存在这个bug。ArcEngine的SDK文档上也没有特别强调INewLineFeedback的使用细节。 本来打算用gdi进行解决,最后发现INewLineFeedback有一个Refresh函数,那么应该在什么地方使用它呢?在ArcMapControl的诸多事件中,尝试了OnAfterDraw、OnAfterScreenDraw、OnViewRefresh等,发现OnAfterScreenDraw是OK的。具体是在OnAfterScreenDraw事件中使用Refresh函数刷新INewLineFeedback,完美解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值