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