PanelMover - Panel bewegen mit gedrückter Maustaste (4Touch?)

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von PascalN.

      PanelMover - Panel bewegen mit gedrückter Maustaste (4Touch?)

      Da mein eeePC demnächst ein Touchpanel bekommt und ich einfach mal ein bisschen mit bewegbaren Panels herumgespielt habe, ist dabei folgender Code entstanden.

      Damit lassen sich Panels mit gedrückter Maustaste "verschieben" - das tolle dabei ist, dass es den Inhalt gleich mit nimmt ^^ !


      Highlights:
      • Nur eine Region per Copy & Paste einfügen
      • Aufruf mit nur einer Zeile

      Die folgende Region in der Klasse einfügen:

      VB.NET-Quellcode

      1. #Region "PanelMover"
      2. ' ---
      3. ' == PanelMover 1.0 ==
      4. ' Panels bewegen mit gedrückter Maustaste (für Touch zum Beispiel, etc.)
      5. ' 05.08.2010 René B.
      6. ' ---
      7. Structure PanelMoverStruct
      8. Dim PanelName As System.Windows.Forms.Panel
      9. Dim PosPanel As Point
      10. Dim PosMaus As Point
      11. End Structure
      12. Dim PanelMover As New PanelMoverStruct
      13. Public WithEvents tmrPanelMover As New Timer
      14. Public Sub tmrPanelMover_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrPanelMover.Tick
      15. PanelMover.PanelName.BringToFront()
      16. PanelMover.PanelName.Location = New Point(MousePosition.X - (PanelMover.PosMaus.X - PanelMover.PosPanel.X), MousePosition.Y - (PanelMover.PosMaus.Y - PanelMover.PosPanel.Y))
      17. End Sub
      18. Private Sub BewegePanelStart(ByVal PanelName As System.Windows.Forms.Panel)
      19. PanelMover.PanelName = CType(PanelName, Panel)
      20. PanelMover.PosMaus = MousePosition
      21. PanelMover.PosPanel = PanelMover.PanelName.Location
      22. tmrPanelMover.Interval = 20
      23. tmrPanelMover.Start()
      24. End Sub
      25. Private Sub BewegePanelEnde()
      26. PanelMover.PanelName = Nothing
      27. PanelMover.PosMaus = Nothing
      28. PanelMover.PosPanel = Nothing
      29. tmrPanelMover.Stop()
      30. End Sub
      31. #End Region


      Aufruf:

      VB.NET-Quellcode

      1. Private Sub Panel1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown
      2. BewegePanelStart(CType(sender, Panel))
      3. End Sub


      Beenden:

      VB.NET-Quellcode

      1. Private Sub Panel1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseUp
      2. BewegePanelEnde()
      3. End Sub


      ---

      Comments erwünscht! Weiss zwar nicht, ob es jemand wirklich etwas produktives bringt, aber ich fande, dass es einen netten Effekt gibt!
      Ich glaube, das geht auch ohne Timer:

      VB.NET-Quellcode

      1. Public Class Form1
      2. ' Maus-Koordinaten
      3. Dim nStartPos As Point
      4. Dim nDragPos As Point
      5. Private Sub MoveControl(ByVal ctrl As Control, ByVal e As System.Windows.Forms.MouseEventArgs)
      6. If e.Button = Windows.Forms.MouseButtons.Left Then
      7. ' aktuelle Mausposition bezogen auf den Desktop ermitteln
      8. Dim nCurPos As Point = ctrl.PointToScreen(New Point(e.X, e.Y))
      9. ' Neue Position des Controls berechnen
      10. Dim nNewPos As New Point(nStartPos.X + nCurPos.X - nDragPos.X, _
      11. nStartPos.Y + nCurPos.Y - nDragPos.Y)
      12. ' Neue Koordianten prüfen und sicherstellen, dass das Control
      13. ' nicht aus den sichtbaren Bereich der Form verschoben wird
      14. With nNewPos
      15. If .X < Me.ClientRectangle.Left Then .X = Me.ClientRectangle.Left
      16. If .X + ctrl.Width > Me.ClientRectangle.Right Then
      17. .X = Me.ClientRectangle.Right - ctrl.Width
      18. End If
      19. If .Y < Me.ClientRectangle.Top Then .Y = Me.ClientRectangle.Top
      20. If .Y + ctrl.Height > Me.ClientRectangle.Bottom Then
      21. .Y = Me.ClientRectangle.Bottom - ctrl.Height
      22. End If
      23. End With
      24. ' Control an neuen Position verschieben
      25. ctrl.Location = nNewPos
      26. End If
      27. End Sub
      28. Private Sub SetPositions(ByVal ctrl As Control, ByVal e As System.Windows.Forms.MouseEventArgs)
      29. If e.Button = Windows.Forms.MouseButtons.Left Then
      30. nStartPos = ctrl.Location
      31. nDragPos = ctrl.PointToScreen(New Point(e.X, e.Y))
      32. End If
      33. End Sub


      Aufruf:

      VB.NET-Quellcode

      1. Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
      2. ' aktuelle Position des Controls und der Maus merken
      3. SetPositions(Button1, e)
      4. End Sub
      5. Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
      6. MoveControl(Button1, e)
      7. End Sub


      Angepasst von: vbarchiv.net/tipps/tipp_1896.html


      Gruss
      Pascal