Benutzer mit den meisten Antworten
Liste iterativ aufbauen

Frage
-
Hi,
ich habe eine Liste mehrerer Listen an Punkten und möchte diese "Liste von Listen" iterativ aufbauen.
Ich möchte jede Mausbewegung in einen Linienzug umsetzen - soweit so gut. Das ganze wird in "Line" gespeichert.
Diese Linie möchte ich dann an die Liste der Linien ("pRefGesture") anhängen mittels "add"-Befehl.
Danach soll "Line" geleert werden, damit ich wiederum einen weiteren Linienzug zeichnen und als neue Liste an pRefGesture anhängen kann usw.Leider funktioniert das nicht wie erwartet, denn es wird immer nur der selbe, gerade aktuelle Linienzug an pRefGesture angehängt, die alten Listeneinträgen werden gelöscht und ebenfalls durch den aktuellen Eintrag ersetzt!
Hat jemand eine Ahnung warum das so ist?
Vielen Dank!
mfgbluefoxxp
Public Class Form1 Private pRefGesture As New List(Of List(Of Point)) Private pDrawingPoints As New List(Of Point) Private Sub PictureBoxInit_MouseDown(ByVal sender As System.Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles PictureBoxInit.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then pAllowDraw = True pLastPoint = e.Location pDrawingPoints.Add(e.Location) End If End Sub Private Sub PictureBoxInit_MouseMove(ByVal sender As System.Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles PictureBoxInit.MouseMove If pAllowDraw AndAlso e.Location <> pLastPoint Then Using g As Graphics = PictureBoxInit.CreateGraphics g.FillEllipse(New SolidBrush(pLineColor), pLastPoint.X - pLineWidth _ \ 2, pLastPoint.Y - pLineWidth \ 2, pLineWidth, pLineWidth) g.DrawLine(New Pen(pLineColor, pLineWidth), pLastPoint, e.Location) pLastPoint = e.Location pDrawingPoints.Add(e.Location) End Using End If End Sub Private Sub PictureBoxInit_MouseUp(ByVal sender As System.Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles PictureBoxInit.MouseUp pAllowDraw = False 'Damit die Mausbewegung nicht mehr aufgezeichnet wird pRefGesture.Add(pDrawingPoints) pDrawingPoints.Clear() End Sub
Antworten
-
Hallo,
neben dem von Tom angesprochenen Problem mit dem CreateGraphics, siehe dazu auch die Diskussion Zeichenmethoden optimieren - gibt es ein weiteres Problem.
Da Du immer die gleiche Auflistung pDrawingPoints verwendest, werden alle Auflistungen den letzten Inhalt haben. Anstatt die Liste zu löschen erzeuge eine neue, d. h. tausche:
pDrawingPoints.Clear()
durch ein
pDrawingPoints = new List(Of Points)()
aus.
Gruß Elmar
- Bearbeitet Elmar BoyeEditor Montag, 16. Juni 2014 21:01
- Als Antwort markiert bluefoxxp Dienstag, 17. Juni 2014 06:24
Alle Antworten
-
Hallo,
ich habe deinen Code in ein neues Projekt kopiert und noch um folgende Anweisungen im Codebehind ergänzt:Dim pAllowDraw As Boolean Dim pLastPoint As Point Dim pLineColor As Color = Color.Red Dim pLineWidth As Integer = 2
Es scheint alles korrekt zu funktionieren:
Ich kann die Linien malen, wie ich will. Deine Liste wird also ordentlich befüllt.
Ich vermute jedoch, das deine Grafik ständig verschwindet, weil du nicht im Paint-Event der PictureBox zeichnest. Das Paint-Event wird immer dann aufgerufen, wenn etwas neu gezeichnet werden muss. Lege also den gesamten Grafikcode in das Paint-Event. (Die Punkte musst du antürlich weiterhin in den Mouse-Events zuur Liste hinzufügen.)Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
neben dem von Tom angesprochenen Problem mit dem CreateGraphics, siehe dazu auch die Diskussion Zeichenmethoden optimieren - gibt es ein weiteres Problem.
Da Du immer die gleiche Auflistung pDrawingPoints verwendest, werden alle Auflistungen den letzten Inhalt haben. Anstatt die Liste zu löschen erzeuge eine neue, d. h. tausche:
pDrawingPoints.Clear()
durch ein
pDrawingPoints = new List(Of Points)()
aus.
Gruß Elmar
- Bearbeitet Elmar BoyeEditor Montag, 16. Juni 2014 21:01
- Als Antwort markiert bluefoxxp Dienstag, 17. Juni 2014 06:24