追踪线对象是DisplayFeedback对象中的一员,是一种用户使用鼠标与控件进行可视化交互的对象。可以使用在不产生任何几何对象的任务中,如测量两点之间的距离、进行管网横断面分析、要素选择等。追踪线对象需要在鼠标事件的配合下才能完成其功能。简而言之,就是固定点和移动点之间的动态变化的连接线。在追踪线操作结束后,不再显示。
LineFeedback常用属性 | |
属性名称 | 说明 |
Display | 只写属性,用于绘制图形时,使显示与屏幕显示区域相结合。 |
Symbol | 可返回或设置对象的符号样式,如未设置,为默认样式。 |
LineFeedback常用方法 | |
方法名称 | 说明 |
Start(IPoint pPoint) | 参数为追踪线对象的起点,即交互过程中用户点击的第一个点。该方法用于开始追踪线对象的操作。 |
Stop() | 结束追踪线对象的操作。结束后追踪线不会绘制在地图上,但追踪线对象仍存在。返回值为IPolyLine |
MoveTo(IPoint pPoint) | 将对象移动到输入点所指定的位置。即用户鼠标当前在屏幕上的位置。 |
AddPoint(IPoint pPoint) | 设置追踪线对象的起点后,使用该方法追加追踪线对象的节点。 |
示例:使用追踪线对象绘制线要素,并在追踪线对象操作结束后,使用IElement在地图上绘制该线要素。追踪线对象需要和鼠标交互完成任务。本代码示例使用鼠标的MouseDown、MouseMove、DoubleClick事件完成该示例。
/*
本代码使用BaseTool(ArcEngine模板)实现,详见 添加新项-->ArcGIS-->Extending ArcObjects-->Base Tool
本代码只介绍追踪线在事件中的使用,关于BaseTool等ArcEngine基础知识,请自行学习
用于测距、测面等场景,显示用户鼠标移动时,固定点和移动点之间的连线
MapControl控件Name设为m_mapControl
*/
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
//追踪线对象字段
private INewLineFeedback m_pNewLineFeedback = null;
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
//判断用户点击是否为鼠标左键
if (Button != 1) return;
//将起点的屏幕坐标转为地图坐标
IPoint pPoint=m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
//判断绘制的要素是否为追踪线起点,即鼠标是否为第一次点击
if (m_pNewLineFeedback == null)
{
//实例化
m_pNewLineFeedback = new NewLineFeedbackClass();
//该方法用于设置样式,如不设置默认显示为黑色实线
getLineSymbol(m_pNewLineFeedback.Symbol as ISimpleLineSymbol);
m_pNewLineFeedback.Display = m_mapControl.ActiveView.ScreenDisplay;
m_pNewLineFeedback.Start(pPoint);
}
//如果不是起点,直接添加到追踪线对象
else
{
m_pNewLineFeedback.AddPoint(pPoint);
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
//判断追踪线对象是否为空
if (m_pNewLineFeedback == null) return;
IPoint pPoint = m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
//MoveTo方法用于实现追踪效果
m_pNewLineFeedback.MoveTo(pPoint);
}
public override void OnDblClick()
{
if (m_pNewLineFeedback == null) return;
IElement pEle = new LineElementClass();
//结束追踪线的操作,该方法返回值为IPolyline
//使用Element获取追踪线对象的几何信息
pEle.Geometry = m_pNewLineFeedback.Stop();
//创建图形容器,用于储存Element元素
IGraphicsContainer pGraphicsContainer = m_mapControl.Map as IGraphicsContainer;
ILineElement pLineEle = pEle as ILineElement;
getLineSymbol(pLineEle.Symbol as ISimpleLineSymbol);
pGraphicsContainer.AddElement(pLineEle as IElement, 0);
m_mapControl.ActiveView.Refresh();
//结束操作后,追踪线对象并不会清空
//要想不影响下次操作,需要将值设置为null
m_pNewLineFeedback = null;
}
//设置样式的方法
private void getLineSymbol(ISimpleLineSymbol pLineSymbol)
{
IRgbColor pRgb = new RgbColorClass()
{
Red = 200,
Blue = 20,
Green = 0
};
pLineSymbol.Color = pRgb;
pLineSymbol.Width = 1.0;
pLineSymbol.Style = esriSimpleLineStyle.esriSLSDash;
}
一种简单方式绘制追踪线,封装性强,定制性较差
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
/*
说明:
1、下面仅为简单的功能实现代码,请读者自行选择其触发事件
2、此代码默认左键双击后,结束追踪线操作
3、此代码未设置样式,追踪线会显示为默认黑色实线样式
*/
//axMapControl为地图控件
IPolyline pPolyline = axMapControl.TrackLine() as IPolyline;
IElement pEle = new LineElementClass();
pEle.Geometry = pPolyline;
(axMapControl.Map as IGraphicsContainer).AddElement(IElement, 0);