¿Cómo dibujo un rectángulo basado en el movimiento del ratón?

Encontré código de ejemplo aquí para dibujar en un formulario:

http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx

Como seguimiento de este requisito (descubrir qué controles están debajo de un rectángulo descrito por el usuario arrastrando el mouse):

Parece que hay una discrepancia entre la ubicación de mis controles y la ubicación de mis eventos MouseDown y -Up

... Quiero proporcionar al usuario comentarios instantáneos / constantes sobre lo que están a punto de seleccionar (cuando / si sueltan el botón del mouse). Quiero no solo dibujar una línea siguiendo el movimiento del mouse, sino dibujar el rectángulo que está siendo descrito por sus esfuerzos de gestión del ratón.

Estoy pensando que el evento MouseMove, junto con el código de los dos enlaces anteriores, podría hacer el truco, pero ¿se dispara con demasiada frecuencia? ¿Eso tendría un impacto malévolo en el rendimiento? Si es así, ¿cuál sería un evento preferible para enganchar, o un temporizador sería el camino a seguir aquí?

ACTUALIZAR

Este código, adaptado del ejemplo de John a continuación (la única diferencia es que StackOverflow induce las llamadas a base. * Están comentadas, y cambié el color de rojo a negro (no se hizo referencia a Stendahl)), funcionaexcepto los rectángulos dibujados previamente se vuelven a mostrar después de soltar el mouse. IOW, el primer rectángulo se dibuja a la perfección, desaparece con el clic del mouse (como se pretende). Sin embargo, cuando describo un segundo rectángulo presionando la tecla izquierda del mouse y arrastrando hacia abajo y hacia la derecha,primero el rectángulo se muestra de nuevo! Y esto sigue sucediendo.cada el rectángulo dibujado previamente se recuerda y se vuelve a resaltar cuando se está dibujando un nuevo rectángulo.

clase parcial pública Form1: Formulario {punto privado? _comienzo; Rectángulo privado _previousBounds;

<code>public Form1()
{
    InitializeComponent();
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    _start = e.Location;
    //base.OnMouseDown(e); 

}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (_start.HasValue)
        DrawFrame(e.Location);

    //base.OnMouseMove(e); 

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    ReverseFrame();
    _start = null;
    //base.OnMouseUp(e); 
}

private void ReverseFrame() 
{ 
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed); 
} 

private void DrawFrame(Point end) 
{ 
    ReverseFrame(); 

    var size = new Size(end.X - _start.Value.X, end.Y - _start.Value.Y); 
    _previousBounds = new Rectangle(_start.Value, size); 
    _previousBounds = this.RectangleToScreen(_previousBounds); 
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed); 
} 
</code>

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta