Eigene Klasse mit Grafikprozedur

  • VB.NET
  • .NET 7–8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von jokonoDus.

    Eigene Klasse mit Grafikprozedur

    hallo zusammen,

    ich wollte mich nicht an einen vorhandenen Thread dranhängen, da meine Frage etwas spezieller sind...

    ich möchte mit einer eigenen Klasse ein Objekt mit aktuellen Daten auf einem Formular erzeugen/darstellen und
    verwende dabei die Grafikfunktionen zB DrawEllipse()....
    Da man hier ja wohl immer die PaintEventArgs aus der .Paint- EreignisProzedur verwenden muss ?(zB e.Graphics.DrawLine())
    Was mir dazu nur einfällt, ist es, in der .Paint() des Formulars eine eigeneZeichen-Methode zu verwenden um den e-Parameter an die Klasse zu übergeben.
    Oder gehts eventuell auch anders und einfacher?
    Stecke ich hier gedanklich in einer Sackgasse ?(
    Vielleicht kann mir ja hier jemand einen guten Rat geben?

    kann auch ruhig nächstes Jahr sein, eilt nicht :D .
    Ansonsten einen guten Rutsch....
    Willkommen im Forum.

    Der von Dir angegebene Weg ist der, den ich ebenfalls nutze, um den ganzen Code nicht in der Formklasse zu haben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @jokonoDus Willkommen im Forum. :thumbup:
    Im Paint-Event Deines Formulars kannst Du Prozeduren aufrufen, die malen, was zu malen ist und kannst ihnen das Graphics-Objekt des PaintEventArgs mitgeben.
    Wenn Du etwas drucken möchtest, kannst Du dieselbe Prozedur aufrufen, nur dass Du dann das Graphics-Objekt des PaintEventArgs aus dem PrintPage-Event verwendest:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' ...
    3. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    4. PrintAll(e.Graphics)
    5. End Sub
    6. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    7. PrintAll(e.Graphics)
    8. End Sub
    9. Private Sub PrintAll(g As Graphics)
    10. g.DrawString("Hallo World", Me.myFont, Brushes.Black, New Point(10, 10))
    11. End Sub
    12. End Class
    Genau so kannst Du Dir eine Struktur aufbauen, für z.B. geometrische Figuren, denen Du das Graphics-Objekt übergibst. Jede Prozedur malt dann sich selbst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Me.Invalidate()
    4. End Sub
    5. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    6. If RadioButton1.Checked Then
    7. MaleEllipse(e.Graphics)
    8. ElseIf RadioButton2.Checked Then
    9. MaleViereck(e.Graphics)
    10. ElseIf RadioButton3.Checked Then
    11. MaleDreieck(e.Graphics)
    12. End If
    13. End Sub
    14. Private Sub MaleDreieck(graphics As Graphics)
    15. graphics.DrawLine(Pens.Red, 10, 110, 110, 110)
    16. graphics.DrawLine(Pens.Red, 110, 110, 60, 160)
    17. graphics.DrawLine(Pens.Red, 60, 160, 10, 110)
    18. End Sub
    19. Private Sub MaleViereck(graphics As Graphics)
    20. graphics.DrawRectangle(Pens.Lime, 10, 110, 110, 110)
    21. End Sub
    22. Private Sub MaleEllipse(graphics As Graphics)
    23. graphics.DrawEllipse(Pens.Blue, 10, 110, 110, 110)
    24. End Sub
    25. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    zu ownerdrawing habich fettes tut zu gemacht: OwnerDrawing

    Und ja: ist absolut sinnvoll, die darzustellenden Daten sich selbst zeichnen zu lassen.
    Zusätzlich ist sinnvoll, ein "Canvas"-Control zu erfinden, und genau auf diesem zu malen.
    Also jede Figur zeichnet sich selber, und das Canvas hält die Liste aller Figuren, und managt auch, ob eine Figur selectiert ist, gedragt wird, zugefügt, gelöscht und so Kram.

    Also das Muster "Figure auf Canvas-Control" hat sich bei mir für vielerlei bewährt.

    Aber OwnerDrawing ist enorm mächtig und vielseitig - je nach Anwendungsfall kann auch anders vorzugehen sinnvoll sein.
    Aber ich hoffe, das wird im Tut auch ersichtlich.

    jokonoDus schrieb:

    (obwohl ich noch nicht weiß, was ein Canvas ist und kann)
    In .Net kannst du eigene Controls programmieren, wenn die Controls, die es eh schon gibt, nicht mehr hinlangen.
    Die erscheinen dann wie alle anderen Controls in der Toolbox, und du kannst sie aufs Form ziehen.
    Das nutze ich, um ein Control zu erschaffen, was besonders gut geeignet ist, dass meine ZeichenFiguren sich darauf zeichnen.
    Diese selbstgebastelten Spezial-Controls nenne ich bislang immer "Canvas" - ZeichenFläche.
    Und sie können genau das, was du ihnen zu können anprogrammierst: ZB Figuren zuzufügen, oder zu entfernen, aber auch noch vieles andere (hovern, selectieren, draggen, Übereinander-Legen).