フォームに描画するためのサンプルコードをここで見つけました。
http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx
この要件のフォローアップとして(ユーザーがマウスをドラッグして記述した長方形の下にあるコントロールを検出する):
コントロールの場所とMouseDownおよび-Upイベントの場所の間に不一致があるようです
...ユーザーが選択しようとしているもの(マウスボタンを離したとき/離した場合)について、ユーザーに即座に/一定のフィードバックを提供したいと思います。マウスの動きに合わせて線を引くだけでなく、ネズミのラングリングで描かれている長方形を描きたいです。
上記の2つのリンクからのコードと組み合わせたMouseMoveイベントでうまくいくと思いますが、頻繁に発生するのでしょうか/パフォーマンスに悪意のある影響を与えるのでしょうか?もしそうなら、フックするのに好ましいイベントは何でしょうか、それともタイマーがここに行く方法でしょうか?
アップデート
このコードは、以下のJohnの例を応用したものです(唯一の違いは、StackOverflowによるbase。*の呼び出しがコメント化されており、色を赤から黒に変更しました(Stendahlへの参照は意図されていません))。以前に描画された長方形を除いて機能します。マウスを離した後、再び表示します。IOW、最初の長方形は完全に描画されます-マウスを上にクリックすると消えます(意図したとおり)。ただし、マウスの左キーを押して右下にドラッグして2番目の長方形を記述すると、最初の長方形が再び表示されます。そして、これは引き続き発生します。以前に描画されたすべての長方形が記憶され、新しい長方形が描画されるときに前面に戻されます。
パブリック部分クラスForm1:フォーム{プライベートポイント?_始める; プライベート長方形_previousBounds;
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);
}
}