废话不说,直接上代码
public class CreateAnnotationTool : BaseTool
{
private IHookHelper _hookHelper;
public IActiveView ActiveView { get; set; }
private IPoint curPoint;
private ITextSymbol textSymbol;
private INewTextFeedback newTextFeedback;
private IRotateTextFeedback rotateTextFeedback;
private bool isStartRotate = false;
public override void OnCreate(object hook)
{
try
{
_hookHelper = new HookHelperClass();
_hookHelper.Hook = hook;
base.m_enabled = true;
}
catch
{
_hookHelper = null;
}
}
public override void OnClick()
{
textSymbol = new TextSymbolClass();
textSymbol.Text = "RRRRRRRRRRRRRR";
(textSymbol as ISymbol).ROP2 = esriRasterOpCode.esriROPNotXOrPen;
curPoint = new PointClass();
curPoint.PutCoords(0, 0);
base.OnClick();
}
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
IPoint point = ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (Button == 1)
{
if (!isStartRotate)
{
if(newTextFeedback != null)
{
newTextFeedback.Stop();
newTextFeedback = null;
}
//停止后有残影,需要手动刷新
ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);
rotateTextFeedback = new RotateTextFeedbackClass();
rotateTextFeedback.Display = ActiveView.ScreenDisplay;
rotateTextFeedback.Symbol = ((IClone)textSymbol).Clone() as ISymbol;
rotateTextFeedback.Start(point, 50000000);//第二个参数为注记的参考比例
isStartRotate = true;
}
else
{
if (rotateTextFeedback != null)
{
double angle = rotateTextFeedback.Stop();
CreateElement(rotateTextFeedback.Anchor, angle);
rotateTextFeedback = null;
isStartRotate = false;
}
}
}
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
IPoint point = ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
if (!isStartRotate)
{
if (newTextFeedback != null)
newTextFeedback.MoveTo(point);
else
{
newTextFeedback = new NewTextFeedbackClass();
newTextFeedback.Display = ActiveView.ScreenDisplay;
newTextFeedback.Symbol = ((IClone)textSymbol).Clone() as ISymbol;
newTextFeedback.Start(point, 50000000);
}
}
else
{
if (rotateTextFeedback != null)
rotateTextFeedback.MoveTo(point);
}
}
private void CreateElement(IGeometry pGeometry, double angle)
{
ITextSymbol mrk = ((IClone)textSymbol).Clone() as ITextSymbol;
mrk.Angle = angle;
ITextElement pMarkerElement = new TextElementClass();
pMarkerElement.Symbol = mrk;
pMarkerElement.Text = mrk.Text;
IElement pElement = pMarkerElement as IElement;
pElement.Geometry = pGeometry;
ActiveView.GraphicsContainer.AddElement(pElement, 0);
IEnvelope pEnvelope = new EnvelopeClass();
pElement.QueryBounds(ActiveView.ScreenDisplay, pEnvelope);
ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pEnvelope);
}
public override void Refresh(int hDC)
{
if (newTextFeedback != null)
{
newTextFeedback.Refresh(hDC);
}
if (rotateTextFeedback != null)
{
rotateTextFeedback.Refresh(hDC);
}
base.Refresh(hDC);
}
}