Die Funktion ist zu kompliziert, als dass ich sie im Detail studiert habe. Was auffällt: Du merkst dir die Mausposition nicht im Augenblick, wo die linke Maustaste gedrückt.
Mein Beispiel arbeitet in drei Schritten:
- Event MouseDown: Die Mausposition wird gespeichert.
- Event MouseMove: Die neue Position der Form wird errechnet: Neue Mausposition minus Mausposition beim Drücken der linken Maustaste ergibt die Formverschiebung. Das für X und Y die gleichen Formeln gelten, wird dies in der Function GetNewLocation abgehandelt).
- Event MouseUp: Festhalten, dass die Maus nicht mehr gedrückt wird (MouseStartLocation = -1,-1)
[CODEANFANG]
Public Class Form1
Dim MouseStartLocation As New Point(-1, -1) ’ linke Maustaste ist nicht gedrückt
Dim ScreenWidth As Integer = My.Computer.Screen.Bounds.Width
Dim ScreenHeight As Integer = My.Computer.Screen.Bounds.Height
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MouseStartLocation = New Point(-1, -1) ’ Linke Maustaste wird (noch) nicht gedrückt.
ScreenWidth = My.Computer.Screen.Bounds.Width
ScreenHeight = My.Computer.Screen.Bounds.Height
End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
’ Die Startposition beim Niederdrücken der linken Maustaste wird notiert
MouseStartLocation = New Point(e.X, e.Y)
End If
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If e.Button = Windows.Forms.MouseButtons.Left Then
’ linke Maustaste nicht gedrückt
MouseStartLocation = New Point(-1, -1)
End If
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Dim SenderObject As Form = Me
If MouseStartLocation.X -1 And MouseStartLocation.Y -1 Then ’ linke Mousetaste ist gedrückt
Dim NewLocationX, NewLocationY As Integer
NewLocationX = GetNewLocation(Me.Location.X, Me.Width, MouseStartLocation.X, e.X, ScreenWidth)
NewLocationY = GetNewLocation(Me.Location.Y, Me.Height, MouseStartLocation.Y, e.Y, ScreenHeight)
Me.Location = New Point(NewLocationX, NewLocationY)
End If
End Sub
Private Function GetNewLocation(ByVal OrgLocation As Integer, ByVal FromWidth As Integer, ByVal MouseStartPosition As Integer, ByVal MousePosition As Integer, ByVal ScreenSize As Integer) As Integer
Dim Distanz As Integer = MousePosition - MouseStartPosition
’ GetNewLocation: Neue Location der Form ermitteln = Ursprüngliche Location + Weg der Maus
GetNewLocation = OrgLocation + Distanz
If GetNewLocation >= 0 Then
’ Die neue Location ist grösser als 0, also bezüglich des linken oder oberen Randes innerhalb des Bildschirms.
If GetNewLocation + FromWidth > ScreenSize Then
’ Die neue Location tritt über den rechten Rand, darum am rechten Rand fixieren
GetNewLocation = ScreenSize - FromWidth
’ Die Startposition beim Drücken der linken Maus wird fixiert (keine Maus-Leerfahrten)
’ Du kannst die folgende Stelle auskommentieren; schau was passiert.
MouseStartPosition = MousePosition
End If
Else
’ Die neue Postion geht über den linken, bzw. oberen Rand hinaus; darum am linken Rand fixieren
GetNewLocation = 0
’ Die Startposition beim Drücken der linken Maus wird fixiert (keine Maus-Leerfahrten)
’ Du kannst die folgende Stelle auskommentieren; schau was passiert.
MouseStartPosition = 0
End If
End Function
End Class
[CODEENDE]