1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#】マウスでPictureBoxに四角形を描画する【ペイント】

Last updated at Posted at 2022-09-16

ラジオボタンでペンと四角形を切り替えられるように設定Animation.gif

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ImageEditing
{
    public partial class frmPaintTool : Form
    {

        //変数
        Bitmap _newBitMap;              //ビットマップ画像
        Bitmap _oldBitMap;              //ビットマップ画像
        bool _mouseDrug;                //マウスクリック中のフラグ
        int _prevX;                     //前のマウスカーソルのX座標
        int _prevY;                     //前のマウスカーソルのY座標
        int _startX;                    //スタートのマウスカーソルのX座標
        int _startY;                    //スタートのマウスカーソルのY座標
        int _penType;                   //ペンモード

        public frmPaintTool()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //BitMapオブジェクトを生成する
            _newBitMap = new Bitmap(DrawingPicBox.Width, DrawingPicBox.Height);
            //ビットマップ画像をコピー
            _oldBitMap = (Bitmap)_newBitMap.Clone();
        }


        private void DrawingPicBox_MouseDown(object sender, MouseEventArgs e)
        {
            //マウスクリック開始判定
            _mouseDrug = true;
            //マウスカーソル位置記憶の初期化
            _prevX = e.Location.X;
            _prevY = e.Location.Y;
            _startX = e.Location.X;
            _startY = e.Location.Y;
        }

        private void DrawingPicBox_MouseUp(object sender, MouseEventArgs e)
        {
            //マウスクリック終了判定
            _mouseDrug = false;
            //最新の画像をコピーする
            _oldBitMap = (Bitmap)_newBitMap.Clone();
        }

        private void DrawingPicBox_MouseMove(object sender, MouseEventArgs e)
        {
            //マウスクリック中に、BitMapにGraphicsオブジェクトで描画する
            if (_mouseDrug == true)
            {
                //BitMapからGraphicsオブジェクトを生成
                Graphics objGrp = Graphics.FromImage(_newBitMap);

                //選択されているツールの種類によって処理を分ける
                if(_penType == 0)
                {
                    //ペンが選択されている場合
                    //描画に利用するペンの色、太さを設定
                    //指定したペンでマウスの位置に線を引く
                    Pen objPen = new Pen(Color.Black, 3);
                    objGrp.DrawLine(objPen, _prevX, _prevY, e.Location.X, e.Location.Y);
                    _prevX = e.Location.X;
                    _prevY = e.Location.Y;
                    objPen.Dispose();
                }
                else if(_penType == 1){
                    //四角形が選択されている場合
                    //_newBitMapを_oldBitMapで上書きする
                    //(マウスクリックを離すまでは描画中の四角形を_newBitMapに保存しない)
                    _newBitMap = (Bitmap)_oldBitMap.Clone();

                    //上書きされた_newBitMapのGraphicsオブジェクトを新たに生成
                    objGrp = Graphics.FromImage(_newBitMap);

                    //四角形の塗りつぶしに利用する色を設定
                    SolidBrush objBrush = new SolidBrush(Color.Black);

                    //FillRectangle()でマウスの位置に四角形を塗る
                    if (_startX <= e.Location.X)
                    {
                        if (_startY <= e.Location.Y)
                        {
                            objGrp.FillRectangle(objBrush, _startX, _startY, e.Location.X - _startX, e.Location.Y - _startY);
                        }
                        else
                        {
                            objGrp.FillRectangle(objBrush, _startX, e.Location.Y, e.Location.X - _startX, _startY - e.Location.Y);
                        }
                    }
                    else
                    {
                        if (_startY <= e.Location.Y)
                        {
                            objGrp.FillRectangle(objBrush, e.Location.X, _startY, _startX - e.Location.X, e.Location.Y - _startY);
                        }
                        else
                        {
                            objGrp.FillRectangle(objBrush, e.Location.X, e.Location.Y, _startX - e.Location.X, _startY - e.Location.Y);
                        }
                    }
                    objBrush.Dispose();
                }

                //BitMapオブジェクトをPictureBoxに表示する
                objGrp.Dispose();
                DrawingPicBox.Image = _newBitMap;
            }
        }

        private void Tools_CheckedChanged(object sender, EventArgs e)
        {
            //現在の選択されているツールの種類を保存
            if(typePen.Checked == true)
            {
                _penType = 0;
            }
            else if(typeSquare.Checked == true)
            {
                _penType = 1;
            }
        }
    }
}

四角形を描くにはFillRectangle()を使う
マウスを離すまで描画中の四角形は途中で上書き保存せずに、離したらその四角形を保存する

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?