Formular an Mausposition öffnen

Verschiedene Anwendungszwecke machen es erforderlich, dass man ein Formular an einer bestimmten Position öffnet. Und selbst wenn es an sich nicht erforderlich ist, steigert es doch die Ergonomie, wenn zum Beispiel ein Popup-Formular an der Stelle erscheint, an der man den Befehl zum Öffnen betätigt hat – beispielsweise durch einen Klick auf eine Schaltfläche oder auf ein anderes Steuerelement. In diesem Beitrag schauen wir uns an, wie wir unabhängig von anderen Elementen ein Formular öffnen und an der Position des Mauszeiters positionieren können. Dazu benötigen wir nichts außer ein paar Ereignisprozeduren und API-Funktionen.

Ausgangsposition

Angenommen, wir wollen ein Popupformular (oder auch ein normales Formular) an der Stelle öffnen, an der sich gerade der Mauszeiger befindet. Das ist sinnvoll, denn wer möchte schon weite Wege mit der Maus zurücklegen, wenn er das zu öffnende Element direkt an der Mausposition anzeigen kann? Standardmäßig haben wir die Möglichkeit, für das Popup-Formular die Eigenschaft Automatisch zentrieren auf Ja einzustellen, dann würde das neue Formular zumindest in der Mitte des Access-Fensters geöffnet werden. Ansonsten könnten wir mit DoCmd.MoveSize arbeiten, aber dies verwendet Koordinaten, die innerhalb des Access-Fensters liegen und die wir zuerst auch ermitteln müssen.

Ziel dieses Beitrags

Am Ende wollen wir eine Lösung haben, mit der wir von einem Formular aus ein weiteres Formular per Mausklick öffnen können. Dabei soll die linke, obere Ecke des geöffneten Formulars sich an der Position des Mauszeigers befinden. Dies könnte ungefähr wie in Bild 1 aussehen.

Öffnen eines Formulars an der Mausposition

Bild 1: Öffnen eines Formulars an der Mausposition

Lösung per API

Also nutzen wir API-Funktionen: Damit können wir nicht nur sehr schnell die aktuelle Position des Mauszeigers ermitteln, sondern auch noch mit einem Befehl die neue Position festlegen. Dazu benötigen wir die folgenden Elemente, zuerst einen Type namens RECT, der die vier Eigenschaften Left, Top, Right und Bottom enthält. Wenn wir eine API-Funktion beispielsweise zum Ermitteln der aktuellen Position und Größe eines Fensters nutzen, liefert diese immer ein solches Konstrukt mit den entsprechenden Werten zurück:

Public Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

Daneben benötigen wir zum Ermitteln der Koordinaten eines Punktes wie zum Beispiel für die Position des Mauszeigers einen Type mit dem folgenden Aufbau:

Private Type POINTAPI
     X As Long
     Y As Long
End Type

Diese beiden Typen deklarieren wir öffentlich zugänglich in einem Modul namens mdlAPI.

Außerdem legen wir dort die drei API-Funktionen aus Listing 1 an. Diese sind bereits für die 64-Bit-Version von Office ausgelegt. Die API-Funktionen haben die folgende Funktion:

Public Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
Public Declare PtrSafe Function MoveWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal x As Long, ByVal y As Long, _
     ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Du hast das Ende des frei verfügbaren Textes erreicht. Möchtest Du ...

Oder bist Du bereits Abonnent und hast Zugangsdaten? Dann logge Dich gleich hier ein:
Die Zugangsdaten findest Du im aktuellen gedruckten Heft oder in der E-Mail, die Du als Abonnent mit jeder neuen Ausgabe erhältst.

Schreibe einen Kommentar