Rechtecke Zeichenen und abspeichern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Rechtecke Zeichenen und abspeichern

    Hallo !

    Wie mach ich das am besten?

    Ich würde auch meiner FOrm gene eine FUnktion einbinden, die es möglich macht rechtecke und linien zu zeichnen - entfernen und ab zu speichern.

    Wie man ein Rechteck mit code zeichnet weiß ich, aber nicht wie man es über benützer eingabe und per drag & drop machen kann.

    mathisderaltefuchs schrieb:

    drag & drop
    Ich hoffe mal, Du meinst nicht D&D, sondern MouseDown und MouseUp.
    Bei MouseDown merkst Du Dir die x- und die y-Position.
    Bei MouseMove ebenfalls und rufst Invalidate() auf, im Paint malst Du eine Linie von den Koordinaten von MouseDown nach MouseMove.
    Bei MouseUp selbes wie MouseMove, nur ist die Linie jetzt komplett, abspeichern.
    Ein Rechteck ist nicht ganz trivial, da musst Du Dir erst eine Verfahrensweise ausdenken, wie Mausbewegungen ein Rechteck definieren können, z.B. über die Diagonale.
    Also: MouseDown ist Punkt1 (nicht unbedingt oben links), da die MouseMove-Richtung nicht bekannt ist.
    MouseMove/MouseUp ist punkt3. Punkt2 und Punkt4 ermittelst Du aus Punkt1, Punkt3 durch orthogonale Vervollständigung.
    Wenn Du schiefe Rechtecke willst, musst Du Dir was anderes ausdenken, das geht dann nicht mehr in einem Ritt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    mathisderaltefuchs schrieb:

    cursor.position.y und x
    geht nicht, nimm e.X und e.Y.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim X1 As Integer
    3. Dim Y1 As Integer
    4. Dim X2 As Integer
    5. Dim Y2 As Integer
    6. Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    7. X1 = e.X
    8. Y1 = e.Y
    9. End Sub
    10. Private Sub Form1_MouseUp(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
    11. X2 = e.X
    12. Y2 = e.Y
    13. Invalidate()
    14. End Sub
    15. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    16. e.Graphics.DrawLine(Pens.AliceBlue, X1, Y1, X2, Y1)
    17. End Sub
    18. End Class
    Fast:

    VB.NET-Quellcode

    1. e.Graphics.DrawLine(Pens.AliceBlue, X1, Y1, X2, Y2)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Coole sache ;) danke für deine kleine aber feine hilfestellung ^^
    Ich hätte noch ein paar interessante sachen - evt. kannst du mir wieder helfen.

    1. Wie kann ich die linie sozusagen vorschauen lassen und beim losslassen wird die erst entgültig gezeichnet
    2. Im Moment kann ich nur 1 Linie zeichen - wenn ich eine neue mach wird diese gelöscht - wie kann ich das verhindern ?
    3. WIe kann ich linen so abspeichern, dass diese nach einem neustart wieder abrufbar sind bzw. angezeigt werden

    4. geht punkt 1 auch mit rechtecken ?

    mfg
    zu 1. Setze ein Flag, das von MouseDown bis MouseUp gültig ist und konfiguriere die Linie.
    zu 2. Pack die fertigen Linien in eine List(Of DEINE_LINIE)
    zu 3. Save die List(Of DEINE_LINIE)
    zu 4.

    VB.NET-Quellcode

    1. e.Graphics.DrawRectangle(Pens.AliceBlue, New Rectangle(X1, Y1, X2 - X1, Y2 - Y1))
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sieh Dir mal das an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private X1 As Integer
    3. Private Y1 As Integer
    4. Private X2 As Integer
    5. Private Y2 As Integer
    6. Private bPaint As Boolean = False
    7. Private bStart As Boolean = False
    8. Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    9. X1 = e.X
    10. Y1 = e.Y
    11. bPaint = False
    12. bStart = True
    13. End Sub
    14. Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
    15. If bStart Then
    16. X2 = e.X
    17. Y2 = e.Y
    18. bPaint = True
    19. Invalidate()
    20. End If
    21. End Sub
    22. Private Sub Form1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
    23. If bStart Then
    24. X2 = e.X
    25. Y2 = e.Y
    26. bPaint = True
    27. Invalidate()
    28. End If
    29. bStart = False
    30. End Sub
    31. Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    32. If bPaint Then
    33. 'e.Graphics.DrawLine(Pens.AliceBlue, X1, Y1, X2, Y2)
    34. e.Graphics.DrawRectangle(Pens.AliceBlue, New Rectangle(X1, Y1, X2 - X1, Y2 - Y1))
    35. End If
    36. End Sub
    37. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke ! :thumbup:

    edit: ..... ich bekomm die lsit of t auch ned hin...

    VB.NET-Quellcode

    1. Sub Liste()
    2. Dim a As New List(Of Object)
    3. a.Add(New Rectangle(Pens.Black, New Rectangle(X1, Y1, X2 - X1, Y2 - Y1)))
    4. End Sub


    Leider ist die Syntax falsch ... aber ich weiß ned wie ich sie berichtige und dann abspeichere/anzeigen lasse.

    mfg

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mathisderaltefuchs“ ()

    VB.NET-Quellcode

    1. Dim a As New List(Of Rectangle)
    2. a.Add(New Rectangle(X1, Y1, X2 - X1, Y2 - Y1))

    Oder Du machst Dir eine Struct / Klasse, wo der Pen und das Rectangle Member sind und packst dieses in die List(Of MyClass)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!