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回