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):
... 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?
ATUALIZAREste 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>
}