PaintEventArgs ueber Picturebox/Form resetten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    PaintEventArgs ueber Picturebox/Form resetten

    Hallo zusammen,

    habe still mitgelesen und nun ist doch der Moment gekommen an dem ich mich anmelde :thumbup:

    Wer kann mir sagen wie man nach dem zeichnen mit PaintEventArgs diese aus der Form entfernt und weiterhin die picturebox verwenden kann? Habe hier einen kleinen Code bei dem 1.jpg mit PaintEventArgs aufgerufen wird und 2.jpg nicht
    Ziel ist es: 1.jpg wird mit PaintEventArgs angezeigt und beim druecken von Button2 2.jpg nur ohne "OZI"

    Mit e.Graphics.Clear(Color.White) funktioniert es, doch danach kann ich keine weiteren Bilder mehr ueber picturebox1.show mehr anzeigen lassen, was passiert hier? ?(

    Bin gespannt ;)

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Public Class Form1
    3. Private fnt As New Font("Arial", 148)
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Try
    6. Me.PictureBox1.Image.Dispose()
    7. Me.PictureBox1.Image = Nothing
    8. Catch ex As Exception
    9. 'Picturebox1 hatte kein Bild geladen
    10. End Try
    11. Me.Invoke(Sub() PictureBox1.Image = System.Drawing.Image.FromFile("1.jpg"))
    12. AddHandler PictureBox1.Paint, AddressOf Me.pictureBox1_Paint
    13. Me.Invoke(Sub() PictureBox1.Show())
    14. End Sub
    15. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    16. Try
    17. Me.PictureBox1.Image.Dispose()
    18. Me.PictureBox1.Image = Nothing
    19. Catch ex As Exception
    20. 'Picturebox1 hatte kein Bild geladen
    21. End Try
    22. Me.Invoke(Sub() PictureBox1.Image = System.Drawing.Image.FromFile("2.jpg"))
    23. ' AddHandler PictureBox1.Paint, AddressOf Me.pictureBox1_Paint
    24. Me.Invoke(Sub() PictureBox1.Show())
    25. End Sub
    26. Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    27. Dim fnt As New Font("Arial", 32)
    28. Dim g As Graphics = e.Graphics
    29. g.DrawString("OZI", fnt, Brushes.Red, New PointF(50, 50))
    30. End Sub
    31. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ATXMega256@32MHz“ ()

    Willkommen im Forum.

    Was soll das mit dem Invoke? Ist doch überflüssig. Und die PicBox kann man auch im Designer setzen/zeichnen/modifizieren.
    Wenn Du OZI bei Button1-Drücken haben willst und bei Button2 nicht, dann bau ne klassenweite Boolean-Variable ein, die in Button1_Click auf True, in Button2_Click auf False gesetzt wird. Und dann schaust Du in pictureBox1_Paint, welchen Wert diese Variable hat und verlässt ggf. vor dem OZI-Zeichnen die Sub.

    bitte korrekte CodeTags verwenden
    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.

    VaporiZed schrieb:

    Willkommen im Forum.


    Danke :)

    VaporiZed schrieb:


    Was soll das mit dem Invoke? Ist doch überflüssig.


    Fuer dieses Beispiel ja, das Programm arbeitet mit mehreren parallelen Threads damit diese auf die Form zugreifen duerfen. (Einfachste Variante)

    VaporiZed schrieb:


    Und die PicBox kann man auch im Designer setzen/zeichnen/modifizieren.


    Ja die Zeilen haette ich mir sparen koennen, im Endeffekt landet es sekundaer unter Form1.Designer.vb, spielt keine Rolle nach dem Kompilieren auf Maschinencode.

    VaporiZed schrieb:


    bitte korrekte CodeTags verwenden


    Danke mache ich

    VaporiZed schrieb:



    Wenn Du OZI bei Button1-Drücken haben willst und bei Button2 nicht, dann bau ne klassenweite Boolean-Variable ein, die in Button1_Click auf True, in Button2_Click auf False gesetzt wird. Und dann schaust Du in pictureBox1_Paint, welchen Wert diese Variable hat und verlässt ggf. vor dem OZI-Zeichnen die Sub.


    Das funktioniert prima, mein Ziel ist ein anderes (habe es schlecht beschrieben) Habe eine Frage zu deinem Ansatz:

    VB.NET-Quellcode

    1. AddHandler PictureBox1.Paint, AddressOf Me.pictureBox1_Paint


    Habe ich nur im Sub fuer Button1, im Sub fuer Button2 ist es auskommentiert, warum wird der Sub

    VB.NET-Quellcode

    1. Me.pictureBox1_Paint
    aufgerufen wenn ich button2 klicke?


    Ueber einen einen weiteren Button sollen die Zeichnungen von PaintEventArgs mit Hilfe von Graphics.Clear entfernt werden, von mir aus kann die picturebox anzeigen was sie will da es sie nicht betrifft.

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. e.Graphics.Clear(Color.White)
    3. End Sub


    Nun dachte ich mir ich deklariere PaintEventArgs in der Klasse in dem sich alle Subs befinden damit alle Threads die Methode

    VB.NET-Quellcode

    1. Graphics.Clear
    aufrufen duerfen:

    VB.NET-Quellcode

    1. Private eee As System.Windows.Forms.PaintEventArgs
    2. Private gg As Graphics = eee.Graphics


    Es wird eine Exception ausgeloest, "eee" war nothing, was fehlt im noch?
    @ATXMega256@32MHz PaintEventArgs kannst Du nicht zwischenspeichern, sie sind nur im Paint-Event aktuell.
    Im Paint-Event wird das Bild "aus dem Kopf heraus" gemalt.
    Wenn Du etwas malen willst, musst Du Deine Kennung setzen und dann das Control invalidisieren, der Rest passiert im Paint-Event, etwa so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim xxx As Integer = 0
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. xxx = 1
    4. pictureBox1.Invalidate()
    5. End Sub
    6. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    7. xxx = 2
    8. pictureBox1.Invalidate()
    9. End Sub
    10. Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    11. Dim g As Graphics = e.Graphics
    12. If xxx = 1 Then
    13. g.Clear(Color.Red)
    14. End If
    15. If xxx = 2 Then
    16. Dim fnt As New Font("Arial", 32)
    17. g.DrawString("OZI", fnt, Brushes.Red, New PointF(50, 50))
    18. End If
    19. End Sub

    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!

    ATXMega256@32MHz schrieb:

    AddHandler PictureBox1.Paint, AddressOf Me.pictureBox1_Paint
    Habe ich nur im Sub fuer Button1, im Sub fuer Button2 ist es auskommentiert
    Das ist wurscht. Wenn einmal der EventHandler mit dem Event gekoppelt ist, bleibt die Kopplung auch. Bis das Programm beendet wird oder Du es mit RemoveHandler rückgängig machst/entkoppelst.
    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.
    ich hab noch nicht verstanden, was der TE eiglich will.
    Also in Post#1 schreibt er es ja:

    ATXMega256@32MHz schrieb:

    Ziel ist es: 1.jpg wird mit PaintEventArgs angezeigt und beim druecken von Button2 2.jpg nur ohne "OZI"
    Nur ergibt mir das keinen Sinn. Bitte nochmal: Was soll wann angezeigt werden?

    Später kommt hinzu:

    ATXMega256@32MHz schrieb:

    Das funktioniert prima, mein Ziel ist ein anderes (habe es schlecht beschrieben) Habe eine Frage zu deinem Ansatz:
    Beschreibt die folgende Frage nun das wirkliche Ziel, oder ist das nur ein Abstecher?