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
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
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:
VB.NET-Quellcode
- Dim xStart, yStart, xEnd, yEnd As Integer
- Dim drawing As Boolean
- Dim Drawbitmap As Bitmap
- Dim Drawbitmap_buffer As Bitmap
- Dim Drawgraphics As Graphics
- Dim Drawgraphics_buffer As Graphics
- Dim myPen As Pen = New Pen(Brushes.Black, 2)
- Dim myBGColor As Color = Color.White
- Dim xStarts() As Integer
- Dim yStarts() As Integer
- Dim xEnds() As Integer
- Dim yEnds() As Integer
- Dim n As Integer = 0
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Drawbitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
- Drawgraphics = Graphics.FromImage(Drawbitmap)
- Drawgraphics_buffer = Graphics.FromImage(Drawbitmap_buffer)
- myPen.StartCap = Drawing2D.LineCap.Round
- myPen.EndCap = Drawing2D.LineCap.Round
- End Sub
- Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
- Drawing = True
- xStart = e.X
- yStart = e.Y
- End Sub
- Private Sub drawMyline()
- Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
- Drawgraphics.DrawLine(myPen, xStart, yStart, xEnd, yEnd)
- 'Linienkoordinaten in Arrays abspeichern
- xStarts(n) = xStart
- yStarts(n) = yStart
- xEnds(n) = xEnd
- yEnds(n) = yEnd
- End Sub
VB.NET-Quellcode
- Dim buffered As Boolean = False
- Private Sub reDraw()
- Drawgraphics.Clear(myBGColor)
- If buffered = True Then
- '??? >> Drawgraphics = Drawgraphics_buffer
- '??? >> Drawbitmap = Drawbitmap_buffer
- End If
- PictureBox1.Image = Drawbitmap
- Drawgraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
- '------alle Linien neu zeichnen - Diesen Teil möchte ich nicht verwenden-----
- Dim k As Integer = 0
- While k <= n
- Drawgraphics.DrawLine(myPen, xStarts(k), yStarts(k), xEnds(k), yEnds(k))
- k = k + 1
- End While
- '---???------------------------
- '!!! letzte Linie zeichnen -- Stattdessen nur das... --
- Drawgraphics.DrawLine(myPen, xStarts(n), yStarts(n), xEnds(n), yEnds(n))
- End Sub
VB.NET-Quellcode
- Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
- If Drawing = True Then
- drawMyline()
- reDraw()
- End If
- xEnd = e.X
- yEnd = e.Y
- End Sub
- Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
- drawing = False
- n = n + 1
- '??? >> Drawbitmap_buffer = Drawbitmap.Clone
- '??? >> Drawgraphics_buffer = Drawgraphics
- buffered = True
- 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