VB GDI: Mousemove linie zeichnen, ohne dass diese "abgehackt" ist

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    VB GDI: Mousemove linie zeichnen, ohne dass diese "abgehackt" ist

    Hey,

    ich arbeite momentan an einem Paint-Programm, und egal wie ich es versuche, das zeichnen sieht nicht annähernd so aus, wie in Microsofts Paint oder Paint.net etc..
    Basierend auf dem Mousemove-event habe ich schon einiges ausprobiert:

    Quellcode

    1. Private Sub canvas_MouseDown(sender As Object, e As MouseEventArgs) Handles canvas.MouseDown
    2. mouseIsDown = True
    3. px = e.X
    4. py = e.Y
    5. gObj.FillRectangle(Brushes.Purple, e.X, e.Y, 10, 10)
    6. canvas.Invalidate()
    7. End Sub
    8. Private Sub canvas_MouseMove(sender As Object, e As MouseEventArgs) Handles canvas.MouseMove
    9. If mouseIsDown = True Then
    10. gObj.DrawLine(Pens.Black, px, py, e.X, e.Y)
    11. canvas.Invalidate()
    12. px = e.X
    13. py = e.Y
    14. End If
    15. End Sub


    und

    Quellcode

    1. Private Sub canvas_MouseMove(sender As Object, e As MouseEventArgs) Handles canvas.MouseMove
    2. If mouseIsDown = True Then
    3. gObj.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5)
    4. canvas.Invalidate()
    5. End If
    6. End Sub
    Bilder
    • draw1.png

      12,46 kB, 834×742, 196 mal angesehen
    • draw2.png

      17,71 kB, 834×748, 175 mal angesehen
    Hi
    die einfachste Lösung ist, einfach Linien zu zeichnen und Ellipsen bzw. Kreise zu füllen. Die Pinseldicke bestimmt hierbei die entsprechende Eigenschaft des Pens und die Breite und Höhe der Ellipse. An jedem Ende der Linie zeichnest du halt dann eine solche Ellipse. Bin mir gerade nicht sicher, ob es nicht auch einen AnchorType gibt, der das erledigt, aber ich vermute mal nicht.
    D.h. du speicherst die Punkte in einer Liste und zeichnest diese z.B. über DrawLines.
    Ich bilde mir auch ein, dass es bei transparenten Farben zu Problemen führen kann. Es wäre also in diesem Fall die Überlegung wert, einen GraphicsPath zu verwenden. Für professionelle Grafikverarbeitung ist GDI+ aber nicht sinnvoll.

    Viele Grüße
    ~blaze~
    Wenn ich das richtig verstehe, dann ist doch "​gObj.DrawLine(Pens.Black, px, py, e.X, e.Y)" genau das? Hierbei sind px und py die letzten Punkte wo das MouseMove Event getriggert wurde, und e.X & e.Y die jetzige Cursor Position.
    Dann zeichnet er halt die Linien, aber aufgrund der Pinseldicke sieht man diese Lücken, wenn man Kurven zeichnet. (siehe Bild 2)