Freigeben über


Positionieren von Objekten auf mehreren Bildschirmen

Ein Fenster oder Menü, das sich auf mehreren Monitoren befindet, verursacht visuelle Störungen für einen Viewer. Um dieses Problem zu minimieren, zeigt das System Menüs und neue und maximierte Fenster auf einem Monitor an. Die folgende Tabelle zeigt, wie der Monitor ausgewählt wird.

Object Standort
Fenster CreateWindow(Ex) zeigt ein Fenster auf dem Monitor an, das den größten Teil des Fensters enthält. Maximiert auf dem Monitor, der den größten Teil des Fensters enthält, bevor es minimiert wurde.
Die Tastenkombination ALT/TAB zeigt ein Fenster auf dem Monitor an, in dem das aktuell aktive Fenster angezeigt wird.
Eigenes Fenster auf demselben Monitor wie sein Besitzer.
Untermenü Wird auf dem Monitor angezeigt, der den größten Teil des entsprechenden Menüelements enthält.
Kontextmenü Wird auf dem Monitor angezeigt, auf dem mit der rechten Maustaste geklickt wurde.
Dropdownliste Wird auf dem Monitor angezeigt, der das Rechteck des Kombinationsfelds enthält.
Dialogfeld Wird auf dem Monitor des Fensters angezeigt, das es besitzt. Wenn es mit DS_CENTERMOUSE Stil definiert ist, wird es mit der Maus auf dem Monitor angezeigt.
Wenn es keinen Besitzer hat und sich das aktive Fenster und das Dialogfeld in derselben Anwendung befinden, wird das Dialogfeld auf dem Monitor des aktuell aktiven Fensters angezeigt.
Wenn das Dialogfeld keinen Besitzer hat und sich das aktive Fenster nicht in derselben Anwendung wie das Dialogfeld befindet, wird das Dialogfeld auf dem primären Monitor angezeigt.
Meldungsfeld Wird auf dem Monitor des Fensters angezeigt, das es besitzt.

 

Wenn ein Fenster zwei Monitore umfasst und einer der Monitore neu positioniert wird, positioniert das System das Fenster auf dem Monitor, der den größten Teil des ursprünglichen Fensters enthält.

Eine Anwendung muss in der Regel auch Objekte positionieren. Beispielsweise muss ein Fenster auf demselben Monitor wie ein anderes Fenster erstellt werden.

So positionieren Sie ein Objekt auf einem System mit mehreren Monitoren

  1. Bestimmen Sie den entsprechenden Monitor.
  2. Rufen Sie die Koordinaten auf den Monitor ab.
  3. Positionieren Sie das Objekt mithilfe der Koordinaten.

In der Regel positionieren Sie ein Objekt entweder auf dem primären Monitor oder auf einem Monitor, auf dem bereits ein Objekt vorhanden ist. Verwenden Sie MonitorFromPoint, MonitorFromRect und MonitorFromWindow, um den Monitor für einen bestimmten Punkt, ein bestimmtes Rechteck oder ein bestimmtes Fenster zu identifizieren.

Um die Koordinaten für den Monitor abzurufen, verwenden Sie GetMonitorInfo, das sowohl den Arbeitsbereich als auch das gesamte Monitorrechteck bereitstellt. Beachten Sie, dass SM_CXSCREEN und SM_CYSCREEN immer auf den primären Monitor verweisen, nicht unbedingt auf den Monitor, der Ihre Anwendung anzeigt. Vermeiden Sie außerdem SM_xxVIRTUALSCREEN, da Ihr Fenster auf dem virtuellen Bildschirm und nicht auf einem Monitor zentrieren.

Um Dialogfelder im Arbeitsbereich eines Fensters zu zentrieren, verwenden Sie den stil DS_CENTER. Verwenden Sie GetWindowRect, um das Dialogfeld auf ein Anwendungsfenster zu zentrieren. Windows schränkt Menüs und Dialogfelder automatisch auf einen Monitor ein. Es kann jedoch ein Problem für benutzerdefinierte Menüs, benutzerdefinierte Dropdownfelder, benutzerdefinierte Toolpaletten und die gespeicherte Anwendungsposition geben.

Ein Beispiel zum korrekten Positionieren von Objekten finden Sie unter Positionieren von Objekten auf einer Einrichtung mit mehreren Anzeigen.

Die Verwendung von SM_CXSCREEN und SM_CYSCREEN zum Bestimmen des Speicherorts einer Anwendungsdesktopsymbolleiste (auch als Appbar bezeichnet) schränkt die App-Leiste auf den primären Monitor ein. Damit sich eine App-Leiste auf einem beliebigen Edge eines Beliebigen Monitors befindet, verwenden Sie die entsprechenden Systemmetriken, um die Kanten der Monitore zu berechnen. Verwenden Sie auch die makros GET_X_LPARAM und GET_Y_LPARAM , um die Koordinaten zu extrahieren, andernfalls ist das Vorzeichen der Koordinaten möglicherweise falsch. Diese Makros sind in Windowsx.h enthalten.

Die Größe eines Vollbildfensters muss sich ändern, wenn es sich zwischen Monitoren mit unterschiedlichen Auflösungen bewegt. Dazu muss die Anwendung mithilfe von MonitorFromWindow oder MonitorFromPoint überprüfen, in welchem Fenster sie sich befindet, und dann GetMonitorInfo verwenden, um die Größe des Monitors abzurufen. Alternativ können Sie den HMONITOR aus der DirectX DirectDrawEnumerateEx-Funktion verwenden. Verwenden Sie dann SetWindowPos , um das Fenster zu positionieren und zu vergrößern, um den Monitor abzudecken.

Ein maximiertes Fenster deckt keine Taskleiste mit der Eigenschaft "Always on top" ab. Ein Vollbildfenster deckt jedoch die Taskleiste ab, z. B. in Microsoft PowerPoint-Bildschirmpräsentationen und -spielen.

Um die Position eines Fensters beim Beenden einer Anwendung zu speichern und später wiederherzustellen, verwenden Sie die Funktionen GetWindowPlacement und SetWindowPlacement . Überprüfen Sie jedoch, ob die Position weiterhin gültig ist, bevor Sie sie verwenden, da der Monitor möglicherweise verschoben oder aus dem System entfernt wurde. Die Anwendung zeigt das Fenster auf dem primären Monitor an, wenn der HMONITOR eines Fensters ungültig ist.

Das System versucht, eine Anwendung auf dem Monitor zu starten, die ihre Verknüpfung enthält. Eine Möglichkeit, eine Anwendung zu positionieren, besteht also darin, die Verknüpfung auf einem gewünschten Monitor zu verwenden.

Wenn Sie ShellExecute oder ShellExecuteEx verwenden, geben Sie einen hWnd an, damit das System alle neuen Fenster auf demselben Monitor wie die aufrufende Anwendung öffnet.

Beachten Sie, dass die Werte für die MINMAXINFO-Struktur für ein System mit mehreren Monitoren geringfügig geändert werden.