代码内容摘自他处,并做简单修改、解释和备注。
Public Class Floating
Private blnDragging As Boolean = False
Private OriginalLocation As Point
Private MoveToPoint As Point
Private Sub ToolStrip1_MouseDown(sender As Object, e As MouseEventArgs) Handles ToolStrip1.MouseDown
Me.blnDragging = True
Me.OriginalLocation = New Point(e.X, e.Y) '获取鼠标按下后在窗体上的位置坐标
End Sub
Private Sub ToolStrip1_MouseUp(sender As Object, e As MouseEventArgs) Handles ToolStrip1.MouseUp
Me.blnDragging = False
End Sub
Private Sub ToolStrip1_MouseMove(sender As Object, e As MouseEventArgs) Handles ToolStrip1.MouseMove
If Me.blnDragging Then
''方法一:
'Me.MoveToPoint = New Point(e.X, e.Y) '鼠标移动后在窗体上的坐标
'Me.Location = Me.PointToScreen(Me.MoveToPoint) - Me.OriginalLocation
'方法二:
Me.MoveToPoint = Me.PointToScreen(New Point(e.X, e.Y)) '获取鼠标相对于屏幕的位置坐标
Me.MoveToPoint.Offset(Me.OriginalLocation.X * -1, Me.OriginalLocation.Y * -1)
Me.Location = Me.MoveToPoint
'Offset算法:
'objPoint = New Point(a,b)
'objPoint.Offset(x,y)
'objPoint.X = a + x,objPoint.Y = b + y
End If
End Sub
Private Sub ToolStrip1_MouseLeave(sender As Object, e As EventArgs) Handles ToolStrip1.MouseLeave
Me.blnDragging = False
End Sub
End Class
在代码末尾我加了鼠标的离开事件的代码。因为调试时发现鼠标移动过快的话会跳出窗体,这时blnDragging仍旧是True,鼠标在未按下的状态下,下一次进入控件会使窗体跟着移动。
方法一和方法二只是方式不同,都可以算出鼠标移动后的位置。