Rendre un controle déplaçable à la souris (.net)

Contenu du snippet

Trois Evenements à ajouter dans un contrôle, et celui-ci devient déplaçable à la souris et magnétique. Il suffit de modifier la valeur de la variable MagneticDistance pour changer la taille du magnétsme.
Je pense qu'il y a des améliorations à apporter, n'hésitez pas à me les indiquer

Source / Exemple :


Public MagneticDistance As Long = 10

Private StartMousePos As Point
Private StartControlPos As Point

Private Sub Tools_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    StartMousePos = Me.PointToScreen(New Point(e.X, e.Y))
    StartControlPos = New Point(Me.Left, Me.Top)
End Sub

Private Sub Tools_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
    StartMousePos = Nothing
End Sub

Private Sub Tools_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
    If e.Button = MouseButtons.Left Then
        Dim NewMousePos As Point = Me.PointToScreen(New Point(e.X, e.Y))
        Dim NewLeft As Long = StartControlPos.X + NewMousePos.X - StartMousePos.X
        Dim NewTop As Long = StartControlPos.Y + NewMousePos.Y - StartMousePos.Y
        If NewLeft < MagneticDistance And (Me.Dock = DockStyle.Left Or Me.Dock = DockStyle.None) Then
            'magnetisme à gauche
            NewLeft = 0
            Me.Dock = DockStyle.Left
        ElseIf NewTop < MagneticDistance And (Me.Dock = DockStyle.Top Or Me.Dock = DockStyle.None) Then
            'magnetisme en haut
            NewTop = 0
            Me.Dock = DockStyle.Top
        ElseIf (NewTop + Me.Height) > (Me.ParentForm.Height - MagneticDistance) And (Me.Dock = DockStyle.Bottom Or Me.Dock = DockStyle.None) Then
            'magnetisme en bas
            NewTop = NewTop + Me.Height
            Me.Dock = DockStyle.Bottom
        ElseIf (NewLeft + Me.Width) > (Me.ParentForm.Width - MagneticDistance) And (Me.Dock = DockStyle.Right Or Me.Dock = DockStyle.None) Then
            'magnetisme à droite
            NewTop = NewTop + Me.Width
            Me.Dock = DockStyle.Right
        Else
            'pas magnétisé
            Me.Dock = DockStyle.None
            'il arrive que le control ne soit pas sous la souris, il faut alors le recentrer
            Dim ControlPos As Point = Me.ParentForm.PointToScreen(New Point(Me.Left, Me.Top))
            Dim MousePos As Point = Me.ParentForm.PointToClient(NewMousePos)
            If NewMousePos.X < ControlPos.X Or NewMousePos.X > (ControlPos.X + Me.Width) Then
                StartControlPos.X = StartMousePos.X - (Me.Width \ 2)
                'NewLeft = StartControlPos.X
            End If
            If NewMousePos.Y < ControlPos.Y Or NewMousePos.Y > (ControlPos.Y + Me.Height) Then
                StartControlPos.Y = StartMousePos.Y - (Me.Height \ 2)
                'NewTop = StartControlPos.Y
            End If
        End If

        Me.Left = NewLeft
        Me.Top = NewTop
    End If
End Sub

Conclusion :


Un copier-coller suffira largement à votre bonheur

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.