Linie aus Graphics/Bitmap löschen ohne alle Linien neu zu zeichnen

  • VB.NET

    Linie aus Graphics/Bitmap löschen ohne alle Linien neu zu zeichnen

    Hallo!
    Ich mach gerade ein Malprogramm und möchte eine Linie wie in MsPaint mit der Maus zeichnen(man klickt und zieht dann die Linie bis man die Maustaste loslässt).
    Das funktioniert eigentlich auch. Bis jetzt habe ich es so gelöst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim xStart, yStart, xEnd, yEnd As Integer
    2. Dim drawing As Boolean
    3. Dim Drawbitmap As Bitmap
    4. Dim Drawbitmap_buffer As Bitmap
    5. Dim Drawgraphics As Graphics
    6. Dim Drawgraphics_buffer As Graphics
    7. Dim myPen As Pen = New Pen(Brushes.Black, 2)
    8. Dim myBGColor As Color = Color.White
    9. Dim xStarts() As Integer
    10. Dim yStarts() As Integer
    11. Dim xEnds() As Integer
    12. Dim yEnds() As Integer
    13. Dim n As Integer = 0
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. Drawbitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    16. Drawgraphics = Graphics.FromImage(Drawbitmap)
    17. Drawgraphics_buffer = Graphics.FromImage(Drawbitmap_buffer)
    18. myPen.StartCap = Drawing2D.LineCap.Round
    19. myPen.EndCap = Drawing2D.LineCap.Round
    20. End Sub
    21. Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    22. Drawing = True
    23. xStart = e.X
    24. yStart = e.Y
    25. End Sub
    26. Private Sub drawMyline()
    27. Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    28. Drawgraphics.DrawLine(myPen, xStart, yStart, xEnd, yEnd)
    29. 'Linienkoordinaten in Arrays abspeichern
    30. xStarts(n) = xStart
    31. yStarts(n) = yStart
    32. xEnds(n) = xEnd
    33. yEnds(n) = yEnd
    34. End Sub


    VB.NET-Quellcode

    1. Dim buffered As Boolean = False
    2. Private Sub reDraw()
    3. Drawgraphics.Clear(myBGColor)
    4. If buffered = True Then
    5. '??? >> Drawgraphics = Drawgraphics_buffer
    6. '??? >> Drawbitmap = Drawbitmap_buffer
    7. End If
    8. PictureBox1.Image = Drawbitmap
    9. Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    10. '------alle Linien neu zeichnen - Diesen Teil möchte ich nicht verwenden-----
    11. Dim k As Integer = 0
    12. While k <= n
    13. Drawgraphics.DrawLine(myPen, xStarts(k), yStarts(k), xEnds(k), yEnds(k))
    14. k = k + 1
    15. End While
    16. '---???------------------------
    17. '!!! letzte Linie zeichnen -- Stattdessen nur das... --
    18. Drawgraphics.DrawLine(myPen, xStarts(n), yStarts(n), xEnds(n), yEnds(n))
    19. End Sub

    VB.NET-Quellcode

    1. Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    2. If Drawing = True Then
    3. drawMyline()
    4. reDraw()
    5. End If
    6. xEnd = e.X
    7. yEnd = e.Y
    8. End Sub
    9. Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
    10. drawing = False
    11. n = n + 1
    12. '??? >> Drawbitmap_buffer = Drawbitmap.Clone
    13. '??? >> Drawgraphics_buffer = Drawgraphics
    14. buffered = True
    15. End Sub

    Das Problem ist, dass beim ziehen der Linie ich immer ReDraw() mache. Allerdings löscht es alle gezeichneten Linien und zeichnet sie dann alle neu außer dass die letzte Linie eine andere ist.
    Das Programm wird sich aber aufhängen wenn er zu viele Linien neu zeichnen muss. Deswegen möchte ich, dass bei MouseUp irgendwie die gezeichneten Linien zusammengefasst werden und er in ReDraw dann nur die letzte Linie löscht und dann zum zusammengefassten eine neue Linien hinzufügt.(Ich hoffe es ist klar)
    Ich habs probiert eine Kopie vom Bitmap und Graphics zu erstellen (_buffer), doch ich bringe es nicht zum laufen.
    Kann mir jemand bei diesem Problem helfen? Danke :)

    EDIT: Habs jetzt gelöst, ich habs überarbeitet indem ich das picturebox.Paint Ereignis und Invalidate verwende

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sk1p“ () aus folgendem Grund: drawmyline ergänzt