Display feedback
DisplayFeedbackSample.cs
// Copyright 2012 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;

namespace DisplayFeedbackSample
{
  public class DisplayFeedbackSample : ESRI.ArcGIS.Desktop.AddIns.Tool
  {

    private INewEnvelopeFeedback NewEnvelopeFeedback;
    private IEnvelope feedbackEnv;
    private IElement feedbackElement;
    private IScreenDisplay feedbackScreenDisplay;
    private ISimpleLineSymbol feedbackLineSymbol;
    private ESRI.ArcGIS.Geometry.Point feedbackStartPoint;
    private ESRI.ArcGIS.Geometry.Point feedbackMovePoint;
  
    public DisplayFeedbackSample()
    {
    }

    protected override void OnUpdate()
    {
      Enabled = ArcMap.Application != null;
    }

    protected override void OnMouseDown(MouseEventArgs Args)
    {
      //initialize all the variables.
      feedbackEnv = new EnvelopeClass();
      feedbackStartPoint = new ESRI.ArcGIS.Geometry.PointClass();
      feedbackMovePoint = new ESRI.ArcGIS.Geometry.PointClass();
      feedbackLineSymbol = new SimpleLineSymbolClass();
      feedbackScreenDisplay = ArcMap.Document.ActiveView.ScreenDisplay;

      feedbackLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDotDot;

      //initialize a new Envelope feedback class and pass it the symbol and display
      NewEnvelopeFeedback = new NewEnvelopeFeedbackClass();
      NewEnvelopeFeedback.Display = feedbackScreenDisplay;
      NewEnvelopeFeedback.Symbol = feedbackLineSymbol as ISymbol;


      //pass the start point from the mouse position, transforming it to an appropriate map point.
      feedbackStartPoint = feedbackScreenDisplay.DisplayTransformation.ToMapPoint(Args.X, Args.Y) as ESRI.ArcGIS.Geometry.Point;
      NewEnvelopeFeedback.Start(feedbackStartPoint);
    }

    protected override void OnMouseMove(MouseEventArgs Args)
    {

      //only pass the point if the mouse button is down
      if (Args.Button.ToString() == "Left")
      {
        //pass X and Y to feedbackMovePoint to transfer to NewEnvelopeFeedback
        feedbackMovePoint = feedbackScreenDisplay.DisplayTransformation.ToMapPoint(Args.X, Args.Y) as ESRI.ArcGIS.Geometry.Point;
        NewEnvelopeFeedback.MoveTo(feedbackMovePoint);
      }
    }

    protected override void OnMouseUp(MouseEventArgs Args)
    {
      //when mouse comes up, end the new envelope and pass it to feedbackEnv.
      feedbackEnv = NewEnvelopeFeedback.Stop();

      //initialize a new RectangleElementClass
      feedbackElement = new RectangleElementClass();

      //pass the new rectangle element, the geometry defined by our feedback object
      feedbackElement.Geometry = feedbackEnv;

      //make sure the element is activated in the current view
      feedbackElement.Activate(feedbackScreenDisplay);

      //now add the newly created element to the ActiveView with default symbology.
      ArcMap.Document.ActiveView.GraphicsContainer.AddElement(feedbackElement, 0);

      //and refresh the view so we can see the changes.
      ArcMap.Document.ActiveView.Refresh();
    }
    
  }

}