DOBON.NET DOBON.NETプログラミング掲示板過去ログ

四角形の描画

  • 題名: 四角形の描画
  • 著者: kunina
  • 日時: 2010/05/17 21:47:11
  • ID: 26830
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Visual Studio 2005 C#]
分類:[.NET]

2010/05/17(Mon) 21:57:53 編集(投稿者)
2010/05/17(Mon) 21:57:43 編集(投稿者)

Visual Studio 2005 C#にて四角形を描画しようとしているのですが。
縦サイズ、横サイズのどちらかがマイナス値の場合描画されません。
円の描画の場合マイナス値があっても描画できるのですがそれはできないのでしょうか…?

マウスがクリックされた時に、縦横の長さがどちらも正の値の場合、始点に対し右下へ四角形が描画。
どちらも負の値の場合、始点に対し左上に描画されてほしいのですが。



    public partial class Form1 : Form
    {
        Image image;

        public Form1()
        {
            image = new Bitmap(300, 300);
            InitializeComponent();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
           
            Brush brush = new SolidBrush(Color.Black);
            Graphics gra = Graphics.FromImage(image);
           
            // 四角形(ここの30の値を負値にすると描画されない)
            gra.FillRectangle(brush, e.X, e.Y, 30, 30);
            // 円
            //g.DrawRectangle(brush, e.X, e.Y, -30, -30);
            Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (image != null)
            {
                e.Graphics.DrawImage(image, 0, 0);
            }
        }
    }
2010/05/17(Mon) 23:19:58 編集(投稿者)

■No26830に返信(kuninaさんの記事)
> // 四角形(ここの30の値を負値にすると描画されない)
gra.FillRectangle(brush, e.X, e.Y, -30, -30);
とするのではなく、
gra.FillRectangle(brush, e.X - 30, e.Y - 30, 30, 30);
のように、「左上」の座標を補正すれば良いかと。


サイズの正負が不定なら、たとえばこんな感じで。

Point pt1 = new Point(…, …);
Point pt2 = pt1 + new Size(…, …);

Rectangle r = new Rectangle(
 Math.Min(pt1.X, pt2.X),
 Math.Min(pt1.Y, pt2.Y),
 Math.Abs(pt1.X - pt2.X),
 Math.Abs(pt1.Y - pt2.Y));

gra.FillRectangle(brush, r);


> // 円
> //g.DrawRectangle(brush, e.X, e.Y, -30, -30);
DrawRectangle は円を描画する命令ではありません。
そもそも、変数 g は宣言すらされていませんよね。

あと、Brush や Graphics を Dispose し忘れています。
using ブロックを使いましょう。
  • 題名: Re[2]: 四角形の描画
  • 著者: kunina
  • 日時: 2010/05/18 22:13:44
  • ID: 26840
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>魔界の仮面弁士さん

ありがとうございます。
うまくできました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板