WinFormsでドラッグ方向に依存せず図形を描く方法
Windows Forms アプリでマウスドラッグを使って図形(円・長方形・直線)を描くサンプルを作ると、ある問題に気づくことがあります。
それは「長方形を右下から左上にドラッグすると描けない」という現象です。
問題の原因
C# の Graphics クラスには FillEllipse や FillRectangle がありますが、両者の挙動は異なります。
- FillEllipse(brush, x, y, width, height)→ 幅や高さが負でも描画可能。結果的に「円はどの方向からドラッグしても描ける」。
- FillRectangle(brush, x, y, width, height)→ 幅や高さが負だと例外が発生。そのため「右下から左上」や「左下から右上」方向では描けない。
つまり 円は大丈夫、四角形だけ問題がある という状況になります。
解決方法:矩形の正規化
解決策はシンプルで、ドラッグで得られた座標を常に「左上基準の正矩形」へ変換してから描画することです。
Math.Min と Math.Abs を使って、座標を補正すればOKです。
修正前(問題あり)
int width = this.endPos.X - this.startPos.X;
int height = this.endPos.Y - this.startPos.Y;
e.Graphics.FillRectangle(brush,
this.startPos.X, this.startPos.Y, width, height);
修正後(負の幅・高さを補正)
int x = Math.Min(this.startPos.X, this.endPos.X);
int y = Math.Min(this.startPos.Y, this.endPos.Y);
int width = Math.Abs(this.endPos.X - this.startPos.X);
int height = Math.Abs(this.endPos.Y - this.startPos.Y);
e.Graphics.FillRectangle(brush, x, y, width, height);
動作確認
修正後は以下のように描けます:
- 左上から右下:OK
- 右下から左上:OK
- 左下から右上:OK
- 右上から左下:OK
どの方向からドラッグしても、長方形が正しく表示されるようになります。
円 (FillEllipse) はもともと対応済みなので修正不要です。
まとめ
- FillEllipse は負のサイズでも動作する → 円は問題なし
- FillRectangle は負のサイズで例外になる → 四角形だけ補正が必要
- Math.Min と Math.Abs を使って座標を正規化する
これで、ドラッグ方向に依存しない図形描画が実現できます。
訪問数 12 回, 今日の訪問数 12回
ディスカッション
コメント一覧
まだ、コメントがありません