Löschen von Kreisen in einer Picturebox

  • VB.NET

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

    Löschen von Kreisen in einer Picturebox

    Hallo liebe VB Community,

    bin ganz frisch hier bei euch gelandet. und habe schon gleich ein kleines problem.

    Ich habe ein kleines programm geschrieben was mit in einer Picturebox mit Hilfe von zwei koordinaten aus zwei textboxen ( x und Y) einen kreis "o" zeichnet. Soweit hab ich das hinbekommen.
    nun möchte ich gerne wenn sich die koordinaten in den textboxen ändern, dass der kreis wieder gelöscht wird und der neue kreis gezeichnet wird.

    und da hänge ich jetzt leider und hoffe von euch kleine tipps bzw denkanstöße zu bekommen ;)

    mfg Milaves
    Deklariere die Koordinaten Global, ändere sie und führe ein Refesh der PictureBox aus, damits neu gezichnet wird.

    Pseudo Code

    VB.NET-Quellcode

    1. Private xy As New Point(3, 5)
    2. Sub PictureBox_Paint()
    3. g.DrawCircle(xy, Radius, Brush)
    4. End Sub
    5. Sub TextChange
    6. xy = New Point(CInt(Textbox1.Text), CInt(Textbox2.Text))
    7. PictureBox.Refresh()
    8. End Sub
    Danke dodo für deine schnelle antwort.

    habe mich leider falsch ausgedrückt^^

    also nochmal zum anfang.
    ich habe zwei textboxen wo die koordinaten eingetragen werden können. durch einen klick auf einen button soll nun mit den koordinaten ein kreis auf eine picturebox gemalt werden. ändere ich nun nach den klicken und klicke wieder auf den button meine koordinaten und klicke wieder auf den button, so soll sich der alte kreis löschen und der neue mit den neuen koordinaten soll gemalt werden.
    Richtig, genauso habe ich es verstanden und das funktioniert auch so, da du die Varialbe für die Koordinaten Global deklarierst. Da dies als Referenz dient, wird nicht jedesmal ein neuer Kreis gezeichnet, sondern der erkennt das es die selbe Variable ist und wechselt die Koordinaten.
    Anders wäre es wenn du bei e.DrawCircle mit New Point(3, 5) arbeitne würdest, da würde jedesmal eine neue Point Instanz erzeug tund somit auch ein neuer Kreis gezeichnet.

    Dodo schrieb:

    Deklariere die Koordinaten Global, ändere sie und führe ein Refesh der PictureBox aus, damits neu gezichnet wird.

    Pseudo Code

    VB.NET-Quellcode

    1. Private xy As New Point(3, 5)
    2. Sub PictureBox_Paint()
    3. g.DrawCircle(xy, Radius, Brush)
    4. End Sub
    5. Sub TextChange
    6. xy = New Point(CInt(Textbox1.Text), CInt(Textbox2.Text))
    7. PictureBox.Refresh()
    8. End Sub
    Hey...

    es tut mir leid aber ich seth irgendwie auf dem schlauch. ich kriege es mit deinem code auch nicht hin.
    habe es bis jetzt so gemacht.

    Private xy As New Point(textbox1.text, textbox2.text)

    Private Sub button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.click

    'hier muss ja irgendwas rein? damit er bei klick auch was macht. nur wie ich das jetzt mit dem verbinde was du mir geschrieben hast, darauf komm ich nicht.
    end sub

    sry bin noch in der lern- und versuchsphase ... ^^
    Naja ich habe es ins TextCange Event gepackt, dann musst du das einfach in dein ButtonClick Event packen

    VB.NET-Quellcode

    1. xy = New Point(CInt(Textbox1.Text), CInt(Textbox2.Text))
    2. PictureBox.Refresh()


    und gaaaaaaaaaaaaanz wichtig .. OPTION STRICT ON, denn das hier

    VB.NET-Quellcode

    1. Private xy As New Point(textbox1.text, textbox2.text)


    Sollte dir eigentlich eine Fehlermeldung ausgeben, da als Paramter von Point Integer und KEINE Strings erwartet werden.
    So....

    Ich habe es nun hinbekommen ;) zwar nicht so ganz wie dodo es beschrieben hatte aber immerhin ^^
    nun stehe ich vor einem neuen Problem. Das ganze soll nun auch funktionieren wenn ich mehrere Strings in die Picturebox zeichene.

    So wie ich es jetzt programiert habe passiert nun folgendes. Der erste String wird gezeichnet. Diesen kann ich auch bearbeiten(er löscht den alten und setzt den neuen auf die neuen koordinaten). Wenn ich nun den zweiten punkt setze (mit hilfe des 2ten Buttons) dann löscht sich der erste String und der 2te wird gezeichnet. das passiert wegen dem Picturebox1.refresh().

    Gibt es eine Möglichkeit das getrennt von einander zu" refreshen"? also das Button1 nur für den ersten Punkt zuständig ist und Button2 nur für Punkt 2 etc.... ( das ganze soll mit 10 punkten passieren ^^ )

    hier mal mein Quellcode

    VB.NET-Quellcode

    1. 'Punktmalen P1
    2. Private Sub Punktmalen1()
    3. Dim ft As Font = Me.Font
    4. Dim g As Graphics = PictureBox1.CreateGraphics()
    5. g.DrawString("O P1", ft, Brushes.Red, x1, y1)
    6. End Sub
    7. 'Punktmalen P2
    8. Private Sub Punktmalen2()
    9. Dim ft As Font = Me.Font
    10. Dim g As Graphics = PictureBox1.CreateGraphics()
    11. g.DrawString("O P2", ft, Brushes.Red, x2, y2)
    12. End Sub
    13. Private Sub Button1_Click() Handles Button1.Click
    14. If CheckBox1.Checked = True Then
    15. If IsNumeric(TextBox2.Text) And IsNumeric(TextBox3.Text) = True Then
    16. x1 = CInt(TextBox2.Text)
    17. y1 = CInt(TextBox3.Text)
    18. PictureBox1.Refresh()
    19. Punktmalen1()
    20. Else
    21. MsgBox("Bitte beide Felder ausfüllen!")
    22. End If
    23. Else
    24. MsgBox("Bitte Schalten sie erst diese Ladung frei!")
    25. End If
    26. End Sub
    27. 'Punkt übertragen P2
    28. Private Sub Button2_Click() Handles Button2.Click
    29. If CheckBox2.Checked = True Then
    30. If IsNumeric(TextBox5.Text) And IsNumeric(TextBox4.Text) = True Then
    31. x2 = CInt(TextBox5.Text)
    32. y2 = CInt(TextBox4.Text)
    33. PictureBox1.Refresh()
    34. Punktmalen2()
    35. Else
    36. MsgBox("Bitte beide Felder ausfüllen!")
    37. End If
    38. Else
    39. MsgBox("Bitte Schalten sie erst diese Ladung frei!")
    40. End If
    41. End Sub
    Der Ansatz ist grundfalsch.
    Man soll nur im _Paint-Event zeichnen, nur mit den Graphics, die man dort über die EventArgs geliefert bekommt.
    Für sowas komplexeres mit mehreren Punkten (kamen nicht noch Strings hinzu?) musst du dir ZeichenObjekte basteln, die selbst wissen, wie sie sich zeichnen sollen, wenn sie ein Graphics kriegen.
    Gugge Control mit beweglicher Figur und für viele: Gezieltes OwnerDrawing
    Ich empfehle, nicht nur den Code anzugugge oder iwas mit C&P zu versuchen, sondern lad die Teile runter, und wurstel selbst im Code herum.