mehrere Panel verschieben aber nicht aufeinander legen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Gizmo.

    mehrere Panel verschieben aber nicht aufeinander legen

    Hallo zusammen,

    ich versuche verzweifelt es hinzubekommen das ich auf einer Form mehrer Panels habe und diese frei Positionieren kann.

    Dies gelingt soweit auh doch nun will ich verhindern das die Panels aufeinander geschoben werden können.

    Unten seht ihr ein Code der dies soweit auch macht aber nicht sauber genug.

    Kann mir jemand sagen was ich falsch mache?



    Dim nStartPos As Point
    Dim nDragPos As Point


    Private Sub Panel1_MouseDown(sender As Object, e As _
    System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Left Then
    nStartPos = Panel1.Location
    nDragPos = Panel1.PointToScreen(New Point(e.X, e.Y))
    End If
    End Sub

    Private Sub Panel1_MouseMove(sender As Object, e As _
    System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
    If e.Button = Windows.Forms.MouseButtons.Left Then
    Dim nCurPos As Point = Panel1.PointToScreen(New Point(e.X, e.Y))
    Dim NewPos As New Point(nStartPos.X + nCurPos.X - nDragPos.X, _
    nStartPos.Y + nCurPos.Y - nDragPos.Y)
    Dim r As Rectangle = Panel1.Bounds
    r.X = NewPos.X + 5
    r.Y = NewPos.Y + 5
    If r.IntersectsWith(Panel2.Bounds) Then Return
    'ist ja nur für den Form Rand gedacht damit es nicht drüber raus
    ' gezogen werden kann
    If NewPos.X < 1 Then NewPos.X = 1
    If NewPos.X > 599 Then NewPos.X = 599
    If NewPos.Y < 1 Then NewPos.Y = 1
    If NewPos.Y > 367 Then NewPos.Y = 367
    Panel1.Location = NewPos
    End If
    End Sub
    Pack Dir die Position der Panels in Rectangle-Strukturen und prüfe dann mit Rectangle.IntersectsWith.
    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!
    Könnte man nicht einfach die position, breite und höhe eines panels und dann abfragen, ob des panel das andere berührt? Wenn es das berührt darf man es in die richtung nicht weiterbewegen. Das könntest du machen in dem du abfragst in welcher richtung das andere Panel liegt und wenn man des in die richtung schiebt wird des immer an den rand zurück gesezt. Ist so iwie sicherlich realisierbar.
    ...aber gut, dass wir darüber gesprochen haben!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim nStartPos As Point
    2. Dim nDragPos As Point
    3. Private Sub IrgendEinPanel_MouseDown(sender As Object, e As _
    4. System.Windows.Forms.MouseEventArgs)
    5. If e.Button = Windows.Forms.MouseButtons.Left Then
    6. Dim aElement As Panel = DirectCast(sender, Panel)
    7. nStartPos = aElement.Location
    8. nDragPos = aElement.PointToScreen(New Point(e.X, e.Y))
    9. End If
    10. End Sub
    11. Private Sub IrgendEinPanel_MouseMove(sender As Object, e As _
    12. System.Windows.Forms.MouseEventArgs)
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. Dim aElement As Panel = DirectCast(sender, Panel)
    15. Dim nCurPos As Point = aElement.PointToScreen(New Point(e.X, e.Y))
    16. Dim NewPos As New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    17. Dim r As Rectangle = aElement.Bounds
    18. r.X = NewPos.X
    19. r.Y = NewPos.Y
    20. Dim have_to_move As Boolean = True
    21. For Each element In Me.Controls.OfType(Of Panel)()
    22. If Not element Is DirectCast(sender, Control) Then
    23. If r.IntersectsWith(element.Bounds) Then have_to_move = False
    24. End If
    25. Next
    26. 'ist ja nur für den Form Rand gedacht damit es nicht drüber raus
    27. ' gezogen werden kann
    28. If NewPos.X < 1 Then NewPos.X = 1
    29. If NewPos.X > 599 Then NewPos.X = 599
    30. If NewPos.Y < 1 Then NewPos.Y = 1
    31. If NewPos.Y > 367 Then NewPos.Y = 367
    32. If have_to_move Then aElement.Location = NewPos
    33. End If
    34. End Sub
    35. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    36. For Each element In Me.Controls.OfType(Of Panel)()
    37. AddHandler element.MouseMove, AddressOf IrgendEinPanel_MouseMove
    38. AddHandler element.MouseDown, AddressOf IrgendEinPanel_MouseDown
    39. Next
    40. End Sub


    1. Bitte den VB-Tag benutzen, damit der Code für andere auch lesbar und nachvollziehbar wird.
    2. InterSectsWith istschon der richtige Weg. Wenn du alle Panels verschieben möchtest, dann müssen auch alle Panels auf die Ereignisse reagieren. Deshalb im Mybase.Load-Ereignis die Zuweisung der Handler. Jetzt gelten die Ereignisprozeduren für alle Panels auf deiner Form. Die Addition von 5 im oberen Bereich habe ich herausgenommen, um dein Beispiel nachvollziehen zu können. Bei Bedarf musst du es wieder hinzufügen.
    3. Da in den Ereignisprozeduren nicht immer das Panel1 gemeint ist, sondern das gerade verwendete Panel, musst du, anstatt Panel1 zu verwenden, das Sender-Objekt verwenden.
    4. Ist nur ein Testbeispiel.

    Panel aufeinander

    Hallo,

    vielleicht hilft mir hier nochmal jemand.

    Das verschieben der verschiedenen Panels funktioniert ja tadellos. Nun möchte ich das ganze etwas ändern. Wenn das erste Panel verschoben wird und auf das 2te geschoben wird dann soll das 2te an die Position des ersten springen. Ich denke es ist möglich allerdings weiß ich noch nicht so recht wie. Mit der obigen Methode habe ich ein sehr guter Anfang. Aber wie bekomme ich die Position des 2ten Panels heraus. Bisher bekomme ich ja nur die Position des 1ten Panel mit und zwar die Start Position und die ablage Position aber ich muss ja denke ich zumindest auch die Position des 2ten mitbekommen