Sicher werden Sie auch schon festgestellt haben, dass die
Bildschirmgröße, die das Screen-Objekt
in den Eigenschaften Width und Height zur Verfügung stellt, sich
tatsächlich auf die absolute Bildschirmgröße bezieht. An den
Bildschirmrändern angedockte Windows-Taskbars bleiben
unberücksichtigt.
Die effektive freie Arbeitsfläche, also die Größe des
Desktops, liefert die API-Funktion SystemParametersInfo
in Verbindung mit der Kennung SPI_ GETWORKAREA. Sie erhalten die
Größe in Pixels in einem bei API-Funktionen üblichen Rechteck.
Zur Umrechnung in Twips multiplizieren Sie die horizontalen
Elemente des Rechtecks (Left und Right) mit Screen.TwipsPerPixelX,
die vertikalen Elemente (Top und Bottom) mit Screen.TwipsPerPixelY
(Verwenden Sie bitte die beiden formal unterschiedlichen
Umrechnungsfaktoren für die vertikale und horizontale Richtung -
auch wenn die beiden Faktoren immer gleich zu sein scheinen, ist das
nicht für jeden möglichen Bildschirm garantiert!). Um die in
Visual Basic gebräuchlichere Breite (Width) und Höhe (Height) zu
erhalten, müssen Sie jeweils die Differenz zwischen den Elementen
Bottom des Rechtecks (Unterkante) und Top bzw. Right (rechte Kante)
und Left berechnen.
Die Hilfsfunktion GetWorkArea besorgt für Sie die Umsetzung des
Rechtecks. Die Werte werden bereits automatisch in Twips
umgerechnet. Setzen Sie dagegen den optionalen Parameter Twips
gleich False, erhalten Sie die Werte in der originalen Maßeinheit
Pixels.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function SystemParametersInfo Lib "user32" _
Alias "SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) _
As Long
Private Const SPI_GETWORKAREA& = 48
Public Sub GetWorkArea(Left As Long, Top As Long, Width As Long, _
Height As Long, Optional ByVal Twips As Boolean = True)
Dim nRect As RECT
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
With nRect
If Twips Then
.Left = .Left * Screen.TwipsPerPixelX
.Top = .Top * Screen.TwipsPerPixelY
.Right = .Right * Screen.TwipsPerPixelX
.Bottom = .Bottom * Screen.TwipsPerPixelY
End If
Left = .Left
Top = .Top
Width = .Right - .Left
Height = .Bottom - .Top
End With
End Sub
Ein Aufruf von GetWorkArea sähe beispielsweise so aus:
Private Sub Command1_Click()
Dim nLeft As Single
Dim nTop As Single
Dim nWidth As Single
Dim nHeight As Single
GetWorkArea nLeft, nTop, nWidth, nHeight
Me.Cls
Me.Print nLeft, nTop, nWidth, nHeight
End Sub
Obwohl Sie ein Form mit
With Form
.Move (Screen.Width - .Width) \ 2, (Screen.Height - .Height) \ 2
End With
bezogen auf den ganzen Bildschirm zentrieren können, sollten Sie
es besser in der Arbeitsfläche zentrieren. Die Hilfs-Funktion
CenterFormInWorkArea erledigt das für Sie - Sie brauchen ihr
lediglich das betreffende Form zu übergeben:
Public Sub CenterFormInWorkArea(Form As Form)
Dim nRect As RECT
Dim nWidth As Single
Dim nHeight As Single
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
With nRect
.Left = .Left * Screen.TwipsPerPixelX
.Top = .Top * Screen.TwipsPerPixelY
nWidth = (.Right - .Left) * Screen.TwipsPerPixelX
nHeight = (.Bottom - .Top) * Screen.TwipsPerPixelY
End With
With Form
.Move nRect.Left + ((nWidth - .Width) \ 2), _
nRect.Top + ((nHeight - .Height) \ 2)
End With
End Sub
Die Hilfs-Funktion MoveFormToWorkArea positioniert ein Form so
dass es exakt die Arbeitsfläche bedeckt.
Public Sub MoveFormToWorkArea(Form As Form)
Dim nRect As RECT
Dim nWidth As Single
Dim nHeight As Single
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
With nRect
.Left = .Left * Screen.TwipsPerPixelX
.Top = .Top * Screen.TwipsPerPixelY
nWidth = (.Right - .Left) * Screen.TwipsPerPixelX
nHeight = (.Bottom - .Top) * Screen.TwipsPerPixelY
Form.Move .Left, .Top, nWidth, nHeight
End With
End Sub
Die folgenden weiteren Hilfs-Funktionen platzieren ein Form an
der linken, oberen, rechten oder unteren Kante der Arbeitsfläche,
ohne seine Größe zu verändern:
Public Sub MoveFormToLeftOfWorkArea(Form As Form)
Dim nRect As RECT
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
Form.Left = nRect.Left * Screen.TwipsPerPixelX
End Sub
Public Sub MoveFormToTopOfWorkArea(Form As Form)
Dim nRect As RECT
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
Form.Top = nRect.Top * Screen.TwipsPerPixelY
End Sub
Public Sub MoveFormToRightOfWorkArea(Form As Form)
Dim nRect As RECT
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
With Form
.Left = nRect.Right * Screen.TwipsPerPixelX - .Width
End With
End Sub
Public Sub MoveFormToBottomtOfWorkArea(Form As Form)
Dim nRect As RECT
SystemParametersInfo SPI_GETWORKAREA, 0&, nRect, 0&
With Form
.Top = nRect.Bottom * Screen.TwipsPerPixelY - .Height
End With
End Sub

|