none
OOP und Windows-Forms RRS feed

  • Frage

  • Hallo,

    ich beschäftige mich noch nicht lange mit c# und hab mir vorgenommen, ein kleines Jump and Run Game zu programmieren. Ich habe mir also ein WinForm Projekt erstellt und das Paint-Event für mich entdeckt. Um nicht linear alles in der Form1 Klasse runterzuschreiben, wollte ich mir z.B. eine "Hindernis" Klasse erstellen, in der ich auf die Paint-Methode aus Form1 zugreife. Soweit kein Problem, OOP eben. Jetzt fordert die pictureBox1_Paint Methode aber die Argumente "Object sender" und "PaintEventArgs e". Was muss ich ihr mitgeben? Ist das der richtige Ansatz bzw. wie würdet ihr das machen?

    Danke schonmal für die Antworten! LG Luca

    Montag, 18. Juli 2016 11:37

Antworten

  • Hallo Luca,

    den Eventhandler des Paint-Events kannst du nicht ohne weiteres einfach wie eine Methode aufrufen. Denn das Event welches da ausgelöst wird gibt ein Graphics-Objekt mit, welches der PictureBox bekannt ist. Das heißt, wenn du mit den PaintEventArgs zeichnest, dann nutzt du etwas was der interne Code der PictureBox verarbeitet. Wenn du nun selbst die Methode (den Eventhandler) aufrufst, bekommst du dagegen von nirgends das Graphics-Objekt zum Übergeben.

    Stattdessen müsstest du die Invalidate-Methode der PictureBox aufrufen. Damit erzwingst du ein neu zeichnen mittels Paint und der Eventhandler wird neu aufgerufen.

    Aus konzeptioneller Sicht würde ich allerdings vermeiden dass die Klasse die Instanz des Controls o.ä. bekommt und so Invalidate aufrufen kann. Stattdessen würde ich eher alle Objekte von einer gemeinsamen Basisklasse ableiten und in einer Liste in der Form aufbewahren. Wenn nun das Paint-Event eintritt, durchläufst du die Liste und zeichnest alles was momentan sichtbar ist, indem du e.Graphics an eine Paint-Methode der Basisklasse übergibst. Die Kind-Klassen können diese Methode dann einfach überschreiben.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Elmar BoyeEditor Dienstag, 19. Juli 2016 16:07
    • Als Antwort markiert Luca Be Dienstag, 19. Juli 2016 17:04
    Montag, 18. Juli 2016 16:15
    Moderator

Alle Antworten

  • Hallo Luca,

    ein "kleines" Jump'n Run Spiel zu programmieren für den Anfang ist schon sehr ambitioniert :-)

    Die Methode  pictureBox1_Paint liefert dir jetzt Object sender - also das Control Picturebox - sowie eben die PaintEventArgs e - mit welchen du in der Methode selbst das Zeichnen durchführen könntest.

    Statt der PictureBox würde ich dir eher das Panel als Zeichnungshintergrund empfehlen!

    Und das Zeichnen kann dann wie folgt durchgeführt werden:

            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawString(DateTime.Now.ToString(), new Font("Arial", 16), Brushes.Red, new PointF(10, 10));
            }

    Damit kannst du erstmal auf der Oberfläche Zeichnen. Später werden dich dann noch ein paar andere Dinge einholen wie

    - Aktualisierung der Oberfläche

    - Überlappung der Elemente

    - ....

    Aber erstmal kannst du damit mal loslegen :-)

    Montag, 18. Juli 2016 14:33
  • Hallo Luca,

    den Eventhandler des Paint-Events kannst du nicht ohne weiteres einfach wie eine Methode aufrufen. Denn das Event welches da ausgelöst wird gibt ein Graphics-Objekt mit, welches der PictureBox bekannt ist. Das heißt, wenn du mit den PaintEventArgs zeichnest, dann nutzt du etwas was der interne Code der PictureBox verarbeitet. Wenn du nun selbst die Methode (den Eventhandler) aufrufst, bekommst du dagegen von nirgends das Graphics-Objekt zum Übergeben.

    Stattdessen müsstest du die Invalidate-Methode der PictureBox aufrufen. Damit erzwingst du ein neu zeichnen mittels Paint und der Eventhandler wird neu aufgerufen.

    Aus konzeptioneller Sicht würde ich allerdings vermeiden dass die Klasse die Instanz des Controls o.ä. bekommt und so Invalidate aufrufen kann. Stattdessen würde ich eher alle Objekte von einer gemeinsamen Basisklasse ableiten und in einer Liste in der Form aufbewahren. Wenn nun das Paint-Event eintritt, durchläufst du die Liste und zeichnest alles was momentan sichtbar ist, indem du e.Graphics an eine Paint-Methode der Basisklasse übergibst. Die Kind-Klassen können diese Methode dann einfach überschreiben.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Elmar BoyeEditor Dienstag, 19. Juli 2016 16:07
    • Als Antwort markiert Luca Be Dienstag, 19. Juli 2016 17:04
    Montag, 18. Juli 2016 16:15
    Moderator
  • Danke! Das war genau der Denkanstoß, den ich brauchte. Den Vorschlag werde ich wohl so übernehmen :)

    Luca Be

    Dienstag, 19. Juli 2016 17:07
  • Hey, Danke für die Antwort! Das Zeichnen hat ja schon ganz gut geklappt und das mit dem Aktualisieren habe ich mir auch schon ergooglet :D aber, dass man mit dem Tool auch Strings schreiben kann wusste ich noch nicht...

    Luca Be

    Dienstag, 19. Juli 2016 17:07