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

Listing 1: Die benötigten API-Funktionen

  • GetCursorPos: Ermittelt die aktuelle Position des Mauszeigers und schreibt diese in die Eigenschaften X und Y eines POINTAPI-Types.
  • GetWindowRect: Ermittelt die Position und Größe eines Fensters, das mit dem Handle hwnd referenziert wird und schreibt diese Informationen in einen RECT-Typ.
  • MoveWindow: Erlaubt das Einstellen der Position und der Größe des mit hwnd referenzierten Fensters. x und y nehmen die Koordinaten der linken, oberen Ecke entgegen und nWidth und nHeight die Höhe und die Breite. Der letzte Parameter bRepaint legt fest, ob das Fenster neu gezeichnet werden soll.

Neben diesen Elementen deklarieren wir im Modul mdlAPI noch die folgenden beiden Variablen:

Public lngX As Long
Public lngY As Long

Diese sollen die Position des Mauszeigers beim Aufrufen des zu öffnenden Formulars speichern und im geöffneten Formular zur Abfrage bereitstellen.

Beispiel zum Öffnen des Formulars an der Position des Mauszeigers

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar