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
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.