none
Liste iterativ aufbauen RRS feed

  • 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!
    mfg

    bluefoxxp

    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

    Montag, 16. Juni 2014 14:52

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


    Montag, 16. Juni 2014 21:01
    Beantworter

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

    Montag, 16. Juni 2014 15:10
    Moderator
  • 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


    Montag, 16. Juni 2014 21:01
    Beantworter