Autor Beitrag
Gorbet
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 23.04.10 18:38 
Hallo zusammen,

ich bin Wiedereinsteiger (habe bis vor 8 Jahren Delphi programmiert) und scheitere seit einer Woche an einer mir selbst gestellten Übungsaufgabe. Vielleicht kann mir jemand helfen. Das Forum hier scheint sehr nett und kompetent zu sein :-)

Ziel ist es eine Anwendung zu schreiben, die Kreise mit Hilfe der Timer-Komponente malt. Ein Button soll neue Kreise (Objekte) erzeugen, die sich bewegen und an der Seite abprallen.

Soweit so gut. In einer Form mit einer endlichen Zahl an Kreisen und ohne Klasse ist das kein Problem (wenn ich für jeden Kreis eine Routine schreibe).

Die Kreise lassen sich zeichnen mit:

Graphics kreis = this.CreateGraphics();
kreis.DrawEllipse(new Pen(Brushes.Blue, 5), x1, y1, r1, r1);

Ich habe es auch geschafft, die Kreise als Objekte (mit einer Klasse Kreise) und einem Button zu erzeugen, mit einem anderen zu entfernen und mir die Anzahl der Objekte als Label anzeigen zu lassen (ohne Zeichnen).

Ich kann zwar ein Objekt erzeugen, die Koordinaten übergeben und genau einen Kreis auch zeichnen lassen, schaffe es aber nicht ein weiteres Objekt zeichnen zu lassen. Zuerst habe ich versucht den Grafikbefehl in die Klasse zu schreiben, bekomme aber beim CreateGraphics-Befehl immer die Fehlermeldung das ich das Objekt mit dem new-Befehl erzeugen soll (allerdings weiß ich nicht wie).
Auch eine Schleife, in der ich versuche einen neuen Kreis für jedes Objekt zu zeichnen, endet immer mit einer Fehlermeldung.

Ich habe das Gefühl, den Wald vor lauter Bäumen nicht zu sehen...

Ich verstehe einfach nicht wie ich den Befehl so konstruieren kann, das für jedes Objekt ein Kreis gezeichnet werden kann. Kann mir jemand einen Tipp geben?

LG
Gorbet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 25.04.10 14:39 
Hallo Gorbet,

zuersteinmal: CreateGraphics solltest du nicht benutzen, s.a. www.mycsharp.de/wbb2...d.php?threadid=21782

Gezeichnet werden sollte NUR im Paint-Ereignis und dann auch nur über das Graphics-Objekt des PaintEventArgs-Parameters!

Wenn du mehrere Kreise zeichnen willst, dann solltest du dir eine passende Datenstruktur überlegen, d.h. z.B. eine List<Point>.
Hier ein Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
List<Point> m_circles = new List<Point>();

void button_Click(object sender, EventArgs e)
{
  int x = ...;
  int y = ...;
  Point p = new Point(x, y);
  m_circles.Add(point); // neuen Kreis hinzufügen

  Invalidate(); // <- Form neu zeichnen lassen
}

void form_Paint(obejct sender, PaintEventArgs e)
{
  using(Pen pen = new Pen(Brushes.Blue, 5))
  {
    foreach(Point p in m_circles)
    {
      const int r = 10// <- hier fester Radius
      e.Graphics.DrawEllipse(pen, p.Left, p.Top, r, r)
    }
  }
]

Das 'using' beim pen ist wichtig, damit das Pen-Objekt am Ende auch wieder 'disposed' wird (alternativ könntest du von Hand 'pen.Dispose()' aufrufen, aber 'using' funktioniert auch bei einer Exception!)

Lies dir am besten den Artikel mal gründlich durch, dort stehen alle wichtigen Informationen bzgl. Zeichnen unter WinForms.
Gorbet Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 26.04.10 09:55 
Vielen Dank für die schnelle Antwort :-)
Auf die Idee wäre ich alleine nie gekommen...

LG
Gorbet