Como faço para desenhar um retângulo baseado no movimento do mouse?

Eu encontrei o código de exemplo aqui para desenhar em um formulário:

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

Como acompanhamento deste requisito (descobrir quais controles estão abaixo de um retângulo descrito pelo usuário arrastando o mouse):

Parece haver uma incompatibilidade entre a localização dos meus controles e a localização dos meus eventos MouseDown e -Up

... Eu quero fornecer ao usuário um feedback instantâneo / constante sobre o que eles estão prestes a selecionar (quando / se eles soltarem o botão do mouse). Eu quero não apenas desenhar uma linha seguindo o movimento do mouse, mas desenhar o retângulo que está sendo descrito pelos seus esforços de quebra de mouse.

Eu estou pensando que o evento MouseMove, juntamente com o código dos dois links acima, poderia fazer o truque, mas isso é acionado com muita freqüência / teria um impacto malevolente no desempenho? Em caso afirmativo, qual seria um evento preferível para enganchar, ou seria um temporizador o caminho a percorrer aqui?

ATUALIZAR

Este código, adaptado do exemplo de John abaixo (a única diferença é que as chamadas indutoras StackOverflow para base. * São comentadas, e eu mudei a cor de vermelho para preto (sem referência a Stendahl)), funcionaexceto que os retângulos previamente desenhados exibem novamente depois de soltar o mouse. IOW, o primeiro retângulo desenha perfeitamente - desaparece com o clique do mouse (como pretendido). No entanto, quando eu descrevo um segundo retângulo, pressionando a tecla esquerda do mouse e arrastando para baixo e para a direita,primeiro retângulo exibe novamente! E isso continua a acontecercada O retângulo previamente desenhado é lembrado e trazido de volta à tona quando um novo retângulo está sendo desenhado.

classe parcial pública Form1: Form {private Point? _começar; Retângulo particular _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>

}

questionAnswers(1)

yourAnswerToTheQuestion