[C#] Freihandzeichnen auf Forms

Drucken
( 1 Vote )
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 17.04.2012 Zuletzt aktualisiert am 17.04.2012 Geschrieben von Jonny132
Heute zeige ich euch eine kleine Spielerei mit der ihr auf einer Form mithilfe des Paint Ereignisses und den Maus Ereignissen Up, Down und Move mit gedrückter Maustaste 'freihandzeichnen' könnt.

Dazu brauchen wir zwei Globale Variablen in der wir speichern ob wir im Moment gezeichnet wird (bei losgelassener Maustaste wollen wir nicht zeichnen) und die Koordinaten der Linien bzw Verbindungspunkte gespeichert werden.
bool m_Drawing;
List<List<Point>> m_Points;
In der Liste speichern wir wiederrum eine Liste mit Punkten, da wir erkennen wollen, wann der Benutzer die Teilfreihandzeichnung zu Ende gezeichnet hat.

Im Form Load Abonnieren wir die benötigten Ereignisse. Diese sind:
  • MouseDown - Das (Teil-)Freihandzeichnen beginnt
  • MouseUp - Die Teilfreihandzeichnung ist fertig
  • MouseMove -  Falls gerade gezeichnet wird (Maustaste gedrückt) wird die Koordinate zwischengespeichert
  • Paint - Hier zeichnen wir die verschiedenen Teilfreihandzeichnungen zusammen auf die Form


Form Load Ereignis

   private void Form1_Load(object sender, EventArgs e)
    {
      m_Points = new List<List<Point>>();
      this.DoubleBuffered = true;
      this.MouseDown += new MouseEventHandler(Form1_MouseDown);
      this.MouseUp += new MouseEventHandler(Form1_MouseUp);
      this.MouseMove += new MouseEventHandler(Form1_MouseMove);
      this.Paint += new PaintEventHandler(Form1_Paint);
    }
Zusätzlich zur registration der eben angesprochenen Events initialisieren wir hier die Liste der (Liste der) Punkte und setzten DoubleBuffered der Form auf true um ein unschönes Flackern der Form zu verhindern.

MouseDown Ereignis
    void Form1_MouseDown(object sender, MouseEventArgs e)
    {
      m_Points.Add(new List<Point>());
      m_Drawing = true;
    }

 

Hier fügen wir unserer Liste eine neue Liste hinzu. Dies stellt eine neue Teilhandzeichnung dar. Desweiteren setzten wir unser m_Drawing-Flag auf true, damit wir im MouseMove - Event 'wissen', dass gerade gezeichnet wird.

MouseUp Ereignis

    void Form1_MouseUp(object sender, MouseEventArgs e)
    {
      m_Drawing = false;
    }
In diesem Event setzen wir nur unser Flag auf false.

MouseMove Ereignis
    void Form1_MouseMove(object sender, MouseEventArgs e)
    {
      if (m_Drawing)
      {
        m_Points[m_Points.Count - 1].Add(e.Location);
        this.Refresh();
      }
    }
Falls das m_Drawing-Flag gesetzt ist, also gerade gezeichnet wird, fügen wir der aktuellen Teilhandzeichnung (dem Letzten Eintrag in m_Points) die aktuelle Mauskoordinate als Punkt hinzu.
Per this.Refresh() zwingen wir die Form sich neu zu zeichnen bzw. das Paint Ereignis auszulösen.

Paint Ereignis
    void Form1_Paint(object sender, PaintEventArgs e)
    {
      foreach (List<Point> points in m_Points)
      {
        if(points.Count > 1)
        e.Graphics.DrawLines(new Pen(new SolidBrush(Color.Black),3), points.ToArray());
      }
    }
Im Paint Ereignis iterieren wir über alle 'Teilhandzeichnungen' und überprüfen, ob mehr als eine Koordinate vorhanden ist, da sich aus einem Punkt bekanntermaßen schwer eine Linie zeichnen lässt. Da uns die PaintEventArgs die Graphics der Form bereitstellen, können wir dessen DrawLines() - Funktion aufrufen. Da diese Funktion nur ein Array von Punkten entgegen nimmt, müssen wir unsere Teilliste per ToArray() noch in ein Array umwandeln.


 

 

    Veröffentlichen Sie ihre Kommentare ...