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); } } }