VB.Net Programm darf nicht über

… Bildschirmrand hinausragen

Hallo,
habe folgenden Code:

[CODE ANFANG]
Private Overloads Sub OnMouseMove(ByVal Sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

Select Case MouseButton
Case Is = Windows.Forms.MouseButtons.Left
’ Bildschirmauflösung
Dim nScreenWidth As Integer
Dim nScreenHeight As Integer
With Screen.PrimaryScreen.Bounds
nScreenWidth = .Width
nScreenHeight = .Height
End With

’ Tatsaechlicher Arbeitsbereich ermitteln
Dim nWorkingWidth As Integer
Dim nWorkingHeight As Integer
With Screen.PrimaryScreen.WorkingArea
nWorkingWidth = .Width
nWorkingHeight = .Height
End With

MyClass.Top = Windows.Forms.Cursor.Position.Y() - MyClass.CurrentPosition.Y()
MyClass.Left = Windows.Forms.Cursor.Position.X() - MyClass.CurrentPosition.X()
If Me.Location.X nWorkingWidth Then
Me.SetDesktopLocation(nWorkingWidth, Me.Location.Y)
End If
If Me.Location.Y > nWorkingHeight Then
Me.SetDesktopLocation(Me.Location.X, nWorkingHeight)
End If
Case Is = Nothing
Exit Sub
End Select
End Sub

[CODE ENDE]

Das klappt zwar halbwegs, aber es muss doch auch noch einfacher gehen, oder nicht? Bei zwei Monitoren klappt es leider nicht, ein Teil der Breite wird zwar noch verendet, aber nicht der komplette Bereich. Mir würde es schon reichen wenn es auf dem Primärmonitor klappen würde.

Hallo,

abgesehen davon, dass „MyClass.CurrentPosition.Y()“ sowohl unter .net 2.0 als auch 4.0 einen Compiler-Fehler verursacht, passiert bei einer Form, in der dieser EventHandler implementiert ist, eigentlich gar nichts.
Vielleicht solltest Du mit dem Event der Form „LocationChanged“ experimentieren.

Gruß
Thomas

ich kann leider nicht helfen, sorry

Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
'Optional
Me.Text = "Position: " & Me.Location.ToString

'Prüfung der horizontalen Position
Select Case Me.Left
Case Is Screen.PrimaryScreen.Bounds.Width - Me.Width 'rechts
Me.Left = Screen.PrimaryScreen.Bounds.Width - Me.Width
End Select

'Prüfung der vertikalen Position
Select Case Me.Top
Case Is Screen.PrimaryScreen.Bounds.Height - Me.Height 'unten
Me.Top = Screen.PrimaryScreen.Bounds.Height - Me.Height
End Select
End Sub

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]

Nachtrag:
Wenn du dem User nur erlauben willst, die Form - gemäss Windows-Standard - über den WindowHeader (blauer Balken) und nicht irgendwo in der Form zu bewegen, ist der Code wesentlich einfacher:

[CODEANFANG]
Public Class Form1

Dim ScreenWidth As Integer = My.Computer.Screen.Bounds.Width
Dim ScreenHeight As Integer = My.Computer.Screen.Bounds.Height

Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
Static CursorPosition As Point
Dim MeLocationX As Integer = Math.Max(Math.Min(Me.Location.X, ScreenWidth - Me.Width), 0)
Dim MeLocationY As Integer = Math.Max(Math.Min(Me.Location.Y, ScreenHeight - Me.Height), 0)
’ Festhalten der letzten gültigen Mausposition
If Me.Location.X = MeLocationX And Me.Location.Y = MeLocationY Then
’ gültige Verschiebung: Position festhalten.
CursorPosition = Cursor.Position
Else
’ ausserhalb des Screens: Cursor an der letzten gültigen Position festnageln.
If Me.Location.X MeLocationX Then
Cursor.Position = New Point(CursorPosition.X, Cursor.Position.Y)
End If
If Me.Location.Y MeLocationY Then
Cursor.Position = New Point(Cursor.Position.X, CursorPosition.Y)
End If
End If
Me.Location = New Point(MeLocationX, MeLocationY)
End Sub
End Class
[CODEENDE]

Hi,

ich verstehe nicht ganz was du mit dem Programm bezwecken willst… Anhand deiner Überschrift hätte ich spontan gesagt das du einfach das Programm auf Maximiert stellst wodurch es ja nicht über den Bildschirmrand hinausragt…

Beschreib mal was du machen willst… Evtl. versteh ich dann auch was du damit anfangen möchtest und kann dir dann evtl. besser helfen… :smile:

Schönen Abend noch…

MfG,
Thomas