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

ラジオボタンでペンと四角形を切り替えられるように設定![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666090/023786da-464f-b03f-eeb4-91a398937315.gif)


```C#
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()を使う
マウスを離すまで描画中の四角形は途中で上書き保存せずに、離したらその四角形を保存する


https://qiita.com/Hnming/items/fe38e3b3d2d4b677226c