VBA Tipp: Accessfenster an Auflösung anpassen

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

  • Mit Access soll die Größe des Accessfensters mittels API Funktion auf eine bestimmte Größe eingestellt werden.
  • Es soll eine Accessanwendung geschrieben werden, die sich bei verschiedenen Bildschirmauflösungen automatisch an die Desktopgröße angepasst.

Was man beachten muss

Es ändert sich lediglich die Größe des Accessfensters. Die Formulare bleiben gleich groß. Um die Anwendung so kompatibel wie möglich zu verschiedenen Bildschirmauflösungen zu machen, sollte man die Formulare für die kleinste Bildschirmauflösung die man unterstützen möchte anpassen. Je größer die Auflösung wird, umso kleiner wird das Accessfenster.

Lösung

Im Kopfbereich des allgemeinen VBA-Moduls werden API Funktionen deklariert. Der benutzdefinierte Typ RECT dient zur Festlegung der Fenstergröße. Die Konstanten SW_MAXIMIZE, SW_SHOWNORMAL, SW_SHOWMINIMIZED sind für die API-Funktion ShowWindow() und stehen für die unterschiedlichen Status eines Anwendungsfensters Danach werden Funktionen und Eigenschaften definiert.

'Quelle: http://www.dbwiki.net/
 
Option Explicit
 
Public Const SW_SHOWNORMAL    As Long = 1
Public Const SW_SHOWMINIMIZED As Long = 2
Public Const SW_MAXIMIZE      As Long = 3
 
Public Type RECT
   x1 As Long
   y1 As Long
   x2 As Long
   y2 As Long
End Type
 
Private Declare Function GetActiveWindow Lib "user32" () As Long
 
Private Declare Function GetParent Lib "user32" ( _
   ByVal hWnd As Long) As Long
 
Private Declare Function ShowWindow Lib "user32" ( _
   ByVal hWnd As Long, _
   ByVal nCmdShow As Long) As Long
 
Private Declare Function IsZoomed Lib "user32" ( _
   ByVal hWnd As Long) As Long
 
Private Declare Function IsIconic Lib "user32" ( _
   ByVal hWnd As Long) As Long
 
Private Declare Function MoveWindow Lib "user32" ( _
   ByVal hWnd As Long, _
   ByVal x As Long, _
   ByVal y As Long, _
   ByVal nWidth As Long, _
   ByVal nHeight As Long, _
   ByVal bRepaint As Long) As Long
 
Private Declare Function GetDesktopWindow Lib "user32" () As Long
 
Private Declare Function GetWindowRect Lib "user32" ( _
   ByVal hWnd As Long, _
   ByRef rectangle As RECT) As Long
 
'Beginn Ergänzung
Private Declare Function SystemParametersInfoA Lib "user32" ( _
   ByVal uiAction As Long, _
   ByVal uiParam As Long, _
   ByRef pvParam As Any, _
   ByVal fWinIni As Long) As Long
'Ende Ergänzung
 
 
Public Function GetScreenResolution() As Long()
   'Diese Funktion gibt die Bildschirmauflösung als Long Array in Pixel aus.
   'Die Breite des Desktop-Fensters steht im Ergebnis an Position 0
   'Die Höhe des Desktopfensters steht im Ergebnis an Position 1
   'Die Höhe der Taskleiste wird nicht berücksichtigt.
 
   Dim r     As RECT
   Dim res() As Long
 
   Call GetWindowRect(GetDesktopWindow(), r)
   ReDim res(1): res(0) = r.x2 - r.x1: res(1) = r.y2 - r.y1
   GetScreenResolution = res
 
End Function
 
'Beginn Ergänzung
' Desktop-Koordinaten ohne Taskbars erhalten
Public Function GetDesktopRect() As RECT
 
   Const SPI_GETWORKAREA As Long = 48
 
   SystemParametersInfoA SPI_GETWORKAREA, 0&, GetDesktopRect, 0&
End Function
'Ende Ergänzung
 
Public Function MinimizeAccess() As Boolean
   MinimizeAccess = ShowWindow(hWndAccessApp, SW_SHOWMINIMIZED)
End Function
 
Public Function MaximizeAccess() As Boolean
   MaximizeAccess = ShowWindow(hWndAccessApp, SW_MAXIMIZE)
End Function
 
Public Function RestoreAccess() As Boolean
   RestoreAccess = ShowWindow(hWndAccessApp, SW_SHOWNORMAL)
End Function
 
Public Property Get AccessIsMaximized() As Boolean
   AccessIsMaximized = IsZoomed(hWndAccessApp)
End Property
 
Public Property Get AccessIsMinimized() As Boolean
   AccessIsMinimized = IsIconic(hWndAccessApp)
End Property
 
Public Property Get AccessIsRestored() As Boolean
   AccessIsRestored = (Not AccessIsMaximized) And (Not AccessIsMinimized)
End Property
 
Public Sub AccessMoveSize(nX As Long, nY As Long, nWidth As Long, nHeight As Long)
   MoveWindow hWndAccessApp, nX, nY, nWidth, nHeight, 1
End Sub

Die festzulegenden Aktionen muss man sich überlegen und wie das Modul in das Programm eingebunden werden soll auch. Dafür gibt es mehrere Möglichkeiten. Es ist ratsam, im Modul direkt bestimmte Subs oder Funktionen zu schreiben und diese aus Formularen oder anderen Modulen anzusprechen. Man könnte auch im Formular die Funktionen des Moduls direkt ansprechen. Ein Beispiel für diese Methode wäre:

Aufruf

Public Sub Bildschirm_anpassen()
 
   Dim rc As RECT
 
   If AccessIsMaximized Or AccessIsMaximized Then
      Call RestoreAccess   'Normales Fenster
   End If
 
   'Beginn Ergänzung
   rc = GetDesktopRect()
   AccessMoveSize  rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top
   'Ende Ergänzung
 
End Sub