MiniPaint

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace _12MiniPaint
{
 
 
    public partial class Form1 : Form
    {
        Pen pen;
        SolidBrush brush;
        Bitmap bmp;
        Graphics gObject;
        Size maxSize;
        Point pt1, pt2, ptlast;    //pt1 bei MouseDown, pt2 bei MouseUp
        bool gefuellt = false;
 
        //enum ... Satz von Konstanten
        enum Figuren
        {
            Linie,
            Ellipse,
            Rechteck,
            Pinsel
        }
 
        Figuren figur = Figuren.Rechteck; 
 
        public Form1()
        {
            InitializeComponent();
            maxSize = pictureBox1.Size;
            //Bitmap für tatsächlich gezeichnete Grafik auf PictureBox
            bmp = new Bitmap(maxSize.Width, maxSize.Height);
            pictureBox1.Image = bmp;
            gObject = Graphics.FromImage(pictureBox1.Image);
            gObject.Clear(pictureBox1.BackColor);
            // gObject.FillRectangle(new SolidBrush(Color.White), 0, 0, maxSize.Width, maxSize.Height);
            pictureBox1.Refresh();
            pen = new Pen(Color.Black);
            brush = new SolidBrush(Color.SteelBlue);
        }
 
        private void Zeichne(Graphics g)
        {
            switch(figur)
            {
                case Figuren.Rechteck:
                    {
                        if(gefuellt) 
                            g.FillRectangle(brush, pt1.X, pt1.Y, pt2.X - pt1.X, pt2.Y - pt1.Y);
                        else
                            g.DrawRectangle(pen, pt1.X, pt1.Y, pt2.X - pt1.X, pt2.Y - pt1.Y);
                        break;
                    }
                case Figuren.Linie:
                    {
                        g.DrawLine(pen,pt1,pt2);
                        break;
                    }
                case Figuren.Ellipse:
                    {
                        if (gefuellt)
                            g.FillEllipse(brush, pt1.X, pt1.Y, pt2.X - pt1.X, pt2.Y - pt1.Y);
                        else
                            g.DrawEllipse(pen, pt1.X, pt1.Y, pt2.X - pt1.X, pt2.Y - pt1.Y);
                        break;
                    }
                case Figuren.Pinsel:
                    {//Direktes Schreiben auf pictureBox1
                        g.DrawLine(pen, ptlast, pt2);
                        g.FillEllipse(new SolidBrush(pen.Color), pt2.X-trackBar1.Value/2, pt2.Y-trackBar1.Value/2, trackBar1.Value, trackBar1.Value);
                        pictureBox1.Refresh();
                        break;
                    }
 
            }
 
        }
 
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            pt2 = e.Location;
            //Zeichnung wird endgültig gezeichnet, direkt auf PictureBox
            Zeichne(gObject);
            pictureBox1.Refresh();
        }
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            pt2 = e.Location;
            //Erstellen einer neuen "Ebene" über PictureBox
            if(e.Button == MouseButtons.Left)
            {
                //using-Anweisung: Am Ende von using werden nicht mehr benötigte
                //Objekte automatisch vom Speicher gelöscht.
                if (figur != Figuren.Pinsel)
                {
                    using (Graphics g = pictureBox1.CreateGraphics())
                    {
                        //"Altes Bild wird in 2. Ebene gespeichert"
                        g.DrawImage(bmp, 0, 0);
                        //neues Objekt wird bei jeder Mausbewegung gezeichnet
                        Zeichne(g);
                    }
                }
                else //Pinsel ausgewählt
                {//Direktes Zeichnen in pictureBox1 über gObject
                    Zeichne(gObject);
                }
            }
            ptlast = pt2;
        }
 
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            figur = Figuren.Rechteck;
        }
 
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            figur = Figuren.Ellipse;
        }
 
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            figur = Figuren.Linie;
        }
 
        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            figur = Figuren.Pinsel;
        }
 
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked) gefuellt = true;
            else gefuellt = false;
        }
 
        private void pBPenColor_Click(object sender, EventArgs e)
        {
            //Ändern der Strichfarbe
            if(colorDialog1.ShowDialog()==DialogResult.OK)
            {
                pen.Color = colorDialog1.Color;
                pBPenColor.BackColor = colorDialog1.Color;
            }
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            pen.Width = trackBar1.Value;
            pictureBox4.Height = trackBar1.Value;
            label4.Text = trackBar1.Value.ToString();
        }
 
        private void pBBrushColor_Click(object sender, EventArgs e)
        {
            //Ändern der Füllfarbe
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                brush.Color = colorDialog1.Color;
                pBBrushColor.BackColor = colorDialog1.Color;
            }
        }
 
        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveForm.Close();
        }
 
        private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                bmp = (Bitmap)Bitmap.FromFile(openFileDialog1.FileName);
                pictureBox1.Image = bmp;
                gObject = Graphics.FromImage(pictureBox1.Image);
                pictureBox1.Refresh();
            }
        }
 
        private void speichernToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(saveFileDialog1.ShowDialog()==DialogResult.OK)
            {
                bmp.Save(saveFileDialog1.FileName);
            }
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            pt1 = e.Location;
            ptlast = e.Location;
            Console.WriteLine(pt1.X + " "+pt1.Y);
        }
    }
}