Panel mit Label Drag&Drop

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von lurker.

    Panel mit Label Drag&Drop

    Hallo Leute!

    Ich habe 4 Panels auf meiner Form, jedes dieser Panel beinhaltet ein Label. Nun sollten diese Panels freibeweglich per Drag&Drop verschoben werden können, was auch funktioniert, doch es sollte auch funktionieren, wenn man auf das Label drückt und zieht.

    Zunächst dachte ich daran, dass ich doch ganz einfach diesen Text per Graphic.DrowString in dieses Panel zeichnen lassen kann. Doch dabei tritt dann der Fehler auf, dass wenn ich ein anderes Panel über dieses Panel drüberziehe, der Text verschwindet.
    Meine nächste Idee währe gewesen, dass ich einfach wenn das auf das Label getrückt wird (lblAntwort1.MouseDown) ich einfach das Even panelContAntwort1.MouseDown per RaiseEvent werfe, doch dies ist leider nicht möglich, und wie's aussieht sehr "dirty" :|

    Leider hab ich keine besseren Ideen, deshalb dachte ich mir ihr könnt mir sicher einen Denkanstoß geben
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Yep, zeig mal Deinen Code. Bei Drag and Drop musst Du gar nichts zeichnen, das geht OutOfTheBox. Darum, zeig mal, was Du da treibst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich benutze derzeit diesen Code von EDR, da ich auf anderen Tapcontrols auch noch andere Controls verschiebe.
    [VB.NET] Controls: Verschieben mittels Drag & Drop und das Click Problem
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _pDown As New Point(Short.MinValue, Short.MinValue)
    2. Private _GrabOffs As Size
    3. Private _PBoxes As Panel()
    4. Private Sub Control_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    5. 'funzt mit allen Controls
    6. Dim toDrag = DirectCast(sender, Control)
    7. _GrabOffs = New Size(Control.MousePosition) - New Size(toDrag.Location)
    8. _pDown = Control.MousePosition - _GrabOffs
    9. 'toDrag.Parent.Controls.SetChildIndex(toDrag, 0)
    10. End Sub
    11. Private Sub Control_MousUp(ByVal sender As Object, ByVal e As MouseEventArgs)
    12. _pDown = New Point(Short.MinValue, Short.MinValue)
    13. End Sub
    14. Private Sub Control_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
    15. 'funzt mit allen Controls
    16. If e.Button <> MouseButtons.Left Then Return
    17. Dim newLoc = Control.MousePosition - _GrabOffs
    18. Const tolerance = 20
    19. Dim rct = New Rectangle(newLoc, New Size(2 * tolerance, 2 * tolerance))
    20. rct.Offset(-tolerance, -tolerance)
    21. If rct.Contains(_pDown) Then Return
    22. _pDown = New Point(Short.MinValue, Short.MinValue)
    23. Dim toDrag = DirectCast(sender, Control)
    24. RemoveHandler toDrag.MouseMove, AddressOf Control_MouseMove
    25. toDrag.Location = newLoc
    26. AddHandler toDrag.MouseMove, AddressOf Control_MouseMove
    27. End Sub
    28. Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    29. _PBoxes = Me.Controls.OfType(Of Panel)().ToArray
    30. For Each pb In _PBoxes
    31. AddHandler pb.MouseDown, AddressOf Control_MouseDown
    32. AddHandler pb.MouseMove, AddressOf Control_MouseMove
    33. AddHandler pb.MouseUp, AddressOf Control_MousUp
    34. Next
    35. End Sub


    Fürs Zeichen benutze ich einfach diesen Code (ich hab jetzt einfach mal die Form_Load geteilt, dass ich den Code hier mal getrennt für euch habe:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    2. graficAntwort1 = Panel1.CreateGraphics
    3. graficAntwort2 = Panel2.CreateGraphics
    4. graficAntwort3 = Panel3.CreateGraphics
    5. graficAntwort4 = Panel4.CreateGraphics
    6. End Sub
    7. Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
    8. graficAntwort1.DrawString(Os.thisString(0), lblAnzeige.font, Brushes.Black, New Point(8, 12))
    9. graficAntwort2.DrawString(Os.thisString(1), lblAnzeige.font, Brushes.Black, New Point(8, 12))
    10. graficAntwort3.DrawString(Os.thisString(2), lblAnzeige.font, Brushes.Black, New Point(8, 12))
    11. graficAntwort4.DrawString(Os.thisString(3), lblAnzeige.font, Brushes.Black, New Point(8, 12))
    12. End Sub
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Der Begriff

    lurker schrieb:

    Drag&Drop
    ist allerdings anders belegt, z.B. Dateien aus dem Explorer auf eine Form ziehen.
    Wenn ich Dich richtig verstanden habe, willst Du also Labels mit der Maus innerhalb eines Panels verschieben.
    Was läuft, was läuft nicht?
    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!

    RodFromGermany schrieb:

    Was läuft, was läuft nicht?

    Als erstes mal danke für die Rückantwort ;)

    RodFromGermany schrieb:

    willst Du also Labels mit der Maus innerhalb eines Panels verschieben.

    Nein, nicht ganz. Ich möchte auf der Form Panels herumschieben. Dies funktioniert auch einwandfrei. Doch nun hab ich 2 Labels auf diesem Panel. Doch, wenn wunderts, kann ich das Panel nicht verschieben, wenn der User auf das Label drückt, da ja davon dann das Panel (Siehe Code von EDR) nichts mitbekommt.

    Nun habe ich eben schon die Lösungsansätze, welche ich im ersten Post schon erwäht habe ausprobiert, doch leider jedes mal ohne erfolg :S (Siehe ersten Post)

    RodFromGermany schrieb:

    Der Begriff

    Zitat von »lurker«
    Drag&Drop

    ist allerdings anders belegt


    Tut mir leid, dachte, da ja Drag&Drop übersetzt "Ziehen&Setzen" heißt, dies auch in diesem Fall zutrifft.
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%

    lurker schrieb:

    Zunächst dachte ich daran, dass ich doch ganz einfach diesen Text per Graphic.DrowString in dieses Panel zeichnen lassen kann. Doch dabei tritt dann der Fehler auf, dass wenn ich ein anderes Panel über dieses Panel drüberziehe, der Text verschwindet.
    Meine nächste Idee währe gewesen, dass ich einfach wenn das auf das Label getrückt wird (lblAntwort1.MouseDown) ich einfach das Even panelContAntwort1.MouseDown per RaiseEvent werfe, doch dies ist leider nicht möglich, und wie's aussieht sehr "dirty" :|


    Hier ;)
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Reich das Mouse_Down, Mouse_Up und Mouse_Move-Event vom Label an sein Parent weiter.
    Ggf. musst Du die Mauskoordinaten noch umrechnen.
    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!

    RodFromGermany schrieb:

    Reich das Mouse_Down, Mouse_Up und Mouse_Move-Event vom Label an sein Parent weiter.


    hmmm....

    VB.NET-Quellcode

    1. Dim l as Label
    2. AddHandler l.MouseClick, AddressOf Panels_MouseClick

    so kann ich ja das Event weiterleiten, doch ich habe diese Panels_MouseClick Methode nicht, da ich ja im MyBase.Load dies ja so löse:

    VB.NET-Quellcode

    1. For Each pb As Panel In _PBoxes
    2. AddHandler pb.MouseDown, AddressOf Control_MouseDown
    3. AddHandler pb.MouseMove, AddressOf Control_MouseMove
    4. AddHandler pb.MouseUp, AddressOf Control_MousUp
    5. Next


    Ich glaube ich versteh ihr iwas sehr sehr falsch :S
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    @lurker: Eher so:

    VB.NET-Quellcode

    1. Private Sub Label1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
    2. Form1_MouseDown(sender, e)
    3. End Sub
    4. Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    5. ' was tun
    6. End Sub
    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!