Grafik in PictureBox löschen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Kai78.

    Grafik in PictureBox löschen

    Hallo

    Ich möchte etwas über variablen in eine PictureBox zeichnen. Eine PictureBox soll es sein da ich mehrere solche Linien haben muss in 5 verschiedenen PictureBoxes und jede einzelne als solches gelöscht werden soll (nicht alle miteinander). Wenn ich jedoch PictureBox1.Dispose() verwende dann werden die Linien im zweiten Durchlauf (i = 1) nicht mehr gezeichnet und ohne das PictureBox1.Dispose() kann ich die Linie in der PictureBox nicht löschen.
    Der Code ist in etwa der folgende:

    Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    For i As Byte = 0 to 1
    If i = 1 then
    Var1 = 20: Var2 = 20: Var3 = 0 Var4 = 0
    PictureBox1.Dispose()
    PictureBox1.Invalidate()
    PictureBox1.Refresh()
    Else
    Var1 = 30: Var2 = 40: Var3 = 10: Var4 = 15
    PictureBox1.Invalidate()
    PictureBox1.Refresh()
    End If
    Next i

    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms. PaintEventArgs) Handles PictureBox1.Paint

    e.Graphics.DrawLine(New Pen(Brushes.White), Var1, Var2, Var3, Var4)

    End Sub

    End Class

    Wäre unglaublich dankbar wenn mir hier jemand helfen könnte da ich wirklich mit meinem Latein am Ende bin.
    hilft da refresh nicht?

    Eine PictureBox soll es sein da ich mehrere solche Linien haben muss in 5 verschiedenen PictureBoxes und jede einzelne als solches gelöscht werden soll


    wieso das denn? du kannst auch mehrere Linien in einer PictureBox zeichnen
    hilft da refresh nicht?


    Nein leider nicht da ich vorher dispose verwendet habe. Bei einem Image funktioniert dies vielleicht aber leider nicht bei einer Grafik.

    wieso das denn? du kannst auch mehrere Linien in einer PictureBox zeichnen


    Könnte ich schon aber dann könnte ich einzelne Linien nicht mehr einzeln löschen. In jeder PictureBox ist eine Linie. Davon soll eine Linie alle 2 Sekunden aus einer zufällig ausgewählten PictureBox gelöscht werden.

    VB.NET-Quellcode

    1. Dim MyPicture as New Bitmap(800,600)
    2. Dim myGraphic as Graphics = Graphics.FromImage(MyPicture)
    3. Private Sub CreatePicture()
    4. 'Hier deine If-Abfrage rein, wann was wie gezeichnet werden soll
    5. myGraphic.DrawLine(New Pen(Color.FromARGB(200,0,200,0)),X,Y,X,Y)
    6. myGraphic.Dispose()
    7. end Sub
    8. Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms. PaintEventArgs) Handles PictureBox1.Paint
    9. e.Graphics.DrawImage(MyPicture,new Point(0,0))
    10. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bsHobbit“ ()

    MyGraphic ist... sagen wir mal deine "Zeichenunterlage" XD

    VB.NET-Quellcode

    1. Dim MyPicture As New Bitmap(800,600)
    2. Dim myGraphic As Graphics
    3. Private Sub CreatePicture()
    4. myGraphic =Graphics.FromImage(MyPicture)
    5. 'Hier deine If-Abfrage rein, wann was wie gezeichnet werden soll
    6. For i as integer = 0 to 100 step 1
    7. myGraphic.DrawLine(New Pen(Color.FromARGB(200,0,200,0)),X,Y,X,Y)
    8. next i
    9. myGraphic.Dispose()
    10. End Sub
    11. Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms. PaintEventArgs) Handles PictureBox1.Paint
    12. e.Graphics.DrawImage(MyPicture,New Point(0,0))
    13. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „bsHobbit“ ()

    Danke für deine Hilfe bsHobbit.
    Ich kann jetzt zwar die Linie löschen aber leider danach nicht mehr einfügen da ich ja MyGraphic.Dispose benutze. Die Linie soll gelöscht und später mittels eines timers wieder eingefügt werden.
    Gibt es irgendeinen Befehl damit man die MyGraphics Variable nach dem Disposen wieder holen kann?
    Original von bsHobbit
    MyGraphic ist... sagen wir mal deine "Zeichenunterlage" XD

    VB.NET-Quellcode

    1. Dim MyPicture As New Bitmap(800,600)
    2. Private Sub CreatePicture()
    3. Dim myGraphic As Graphics =Graphics.FromImage(MyPicture)
    4. 'Hier deine If-Abfrage rein, wann was wie gezeichnet werden soll
    5. For i as integer = 0 to 100 step 1
    6. myGraphic.DrawLine(New Pen(Color.FromARGB(200,0,200,0)),X,Y,X,Y)
    7. next i
    8. myGraphic.Dispose()
    9. End Sub
    10. Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms. PaintEventArgs) Handles PictureBox1.Paint
    11. e.Graphics.DrawImage(MyPicture,New Point(0,0))
    12. End Sub


    Hab den Quelltext angepasst, das sollte so laufen.
    Danke das hatte ich schon versucht.
    Leider funktioniert das bei mir nicht. D.h. die Linie wird nicht aus der PictureBox gelöscht. Dies funktioniert nachwievor nur mit PictureBox1.Dispose() was schlecht ist da ich nachher die PictureBox1 nicht mehr benützen kann.
    Die PictureBox1 nach dem disposen neu zu initialisieren geht leider auch nicht (oder ich weiss nicht wie) da sie dann ja privat wäre.
    Ich hoffe jemand weiss noch rat. Vielen Dank...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim pt1, pt2 As New Point
    3. Dim counter, zufallszahl As Byte
    4. Dim mypicture As New Bitmap(800, 600)
    5. Dim zfz As New Random
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Timer1.Interval = 3000
    8. counter = counter + 1
    9. If counter = 1 Then
    10. pt1.X = 20
    11. pt1.Y = 40
    12. pt2.X = 30
    13. pt2.Y = 50
    14. Else
    15. pt1.X = 20 + (counter * 10)
    16. pt1.Y = 40 + (counter * 10)
    17. pt2.X = 30 + (counter * 10)
    18. pt2.Y = 50 + (counter * 10)
    19. End If
    20. zufallszahl = zfz.Next(1, 4)
    21. Select Case zufallszahl
    22. Case 1
    23. PictureBox1.Refresh()
    24. Case 2
    25. PictureBox2.Refresh()
    26. Case 3
    27. PictureBox3.Refresh()
    28. Case 4
    29. PictureBox4.Refresh()
    30. End Select
    31. End Sub
    32. Private Sub CreatePicture()
    33. Dim mygraphic As Graphics = Graphics.FromImage(mypicture)
    34. mygraphic.DrawLine(New Pen(Color.Black, 1), pt1, pt2)
    35. mygraphic.Dispose()
    36. End Sub
    37. Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    38. CreatePicture()
    39. e.Graphics.DrawImage(mypicture, New Point(0, 0))
    40. End Sub
    41. Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
    42. CreatePicture()
    43. e.Graphics.DrawImage(mypicture, New Point(0, 0))
    44. End Sub
    45. Private Sub PictureBox3_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox3.Paint
    46. CreatePicture()
    47. e.Graphics.DrawImage(mypicture, New Point(0, 0))
    48. End Sub
    49. Private Sub PictureBox4_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox4.Paint
    50. CreatePicture()
    51. e.Graphics.DrawImage(mypicture, New Point(0, 0))
    52. End Sub
    53. End Class



    Hierbei kannst du sehen, dass die alte Linie beibehalten wird und sogar bei den anderen mitgezeichnet wird. Habe hier jetzt absichtlich das PictureBox.Dispose rausgenommen.