將物件放置在多個顯示器監視器上
在多個監視器上的視窗或功能表會導致檢視者的視覺中斷。 為了將這個問題降到最低,系統會在一部監視器上顯示功能表和新的和最大化視窗。 下表顯示如何選擇監視器。
Object | 位置 |
---|---|
時間範圍 |
CreateWindow (Ex) 會在包含視窗最大部分的監視器上顯示視窗。在最小化之前,在包含視窗最大部分的監視器上最大化。 ALT-TAB 按鍵組合會在具有目前使用中視窗的監視器上顯示視窗。 |
擁有的視窗 | 在與其擁有者相同的監視器上。 |
子 | 出現在包含對應功能表項目最大部分的監視器上。 |
內容功能表 | 出現在發生滑鼠右鍵的監視器上。 |
下拉式清單 | 出現在包含下拉式方塊矩形的監視器上。 |
對話方塊 | 出現在擁有它的視窗監視器上。如果使用DS_CENTERMOUSE樣式定義,則會以滑鼠出現在監視器上。 如果它沒有擁有者,而且對話方塊位於相同的應用程式中,對話方塊會出現在目前使用中視窗的監視器上。 如果對話方塊沒有擁有者,而且使用中視窗不在與對話方塊相同的應用程式中,對話方塊會出現在主要監視器上。 |
訊息方塊 | 出現在擁有它的視窗監視器上。 |
如果視窗跨越兩個監視器,而其中一個監視器已重新置放,則系統會將視窗放在包含原始視窗最大部分的監視器上。
應用程式通常需要放置物件。 例如,可能需要在與另一個視窗相同的監視器上建立視窗。
將物件放在多個監視系統上
- 判斷適當的監視器。
- 取得監視器的座標。
- 使用座標放置 物件。
一般而言,您會將物件放在主要監視器上,或位於已經有物件的監視器上。 若要識別指定點、矩形或視窗的監視器,請使用 MonitorFromPoint、 MonitorFromRect和 MonitorFromWindow。
若要取得監視器的座標,請使用 GetMonitorInfo,其同時提供工作區和整個監視器矩形。 請注意,SM_CXSCREEN和SM_CYSCREEN一律參考主要監視器,不一定是顯示應用程式的監視器。 此外,請避免SM_xxVIRTUALSCREEN,因為這會將您的視窗置中虛擬畫面,而不是監視器。
若要將對話方塊置中視窗的工作區域,請使用DS_CENTER樣式。 若要將對話方塊置中至應用程式視窗,請使用 GetWindowRect。 Windows 會自動將功能表和對話方塊限制為監視器。 不過,自訂功能表、自訂下拉式方塊、自訂工具選擇區,以及已儲存的應用程式位置可能會發生問題。
如需如何正確定位物件的範例,請參閱 在多個顯示設定上放置物件。
使用 SM_CXSCREEN 和 SM_CYSCREEN 來判斷應用程式桌面工具列的位置, (也稱為 appbar) 會將 appbar 限制為主要監視器。 若要允許 appbar 位於任何監視器的任何邊緣,請使用適當的系統計量來計算監視器的邊緣。 此外,使用 GET_X_LPARAM 和 GET_Y_LPARAM 宏來擷取座標,否則座標的正負號可能會錯誤。 這些宏包含在 Windowsx.h 中。
全螢幕視窗的大小需要在不同解析度的監視器之間移動時變更。 若要這樣做,應用程式必須使用 MonitorFromWindow 或 MonitorFromPoint 檢查其開啟的視窗,然後使用 GetMonitorInfo 來取得監視器的大小。 或者,您可以使用 DirectX DirectDrawEnumerateEx函式中的HMONITOR。 然後使用 SetWindowPos 來錨定視窗並調整其大小,以涵蓋監視器。
最大化的視窗未涵蓋具有 「Always on top」 屬性的工作列。 不過,全螢幕視窗涵蓋工作列,例如,在 Microsoft PowerPoint 投影片放映和遊戲中。
若要儲存及稍後還原,應用程式結束時視窗的位置,請使用 GetWindowPlacement 和 SetWindowPlacement 函式。 不過,請檢查位置在使用之前是否仍然有效,因為監視可能已經從系統移動或移除。 如果視窗的 HMONITOR 無效,應用程式就會在主要監視器上顯示視窗。
系統會嘗試在包含其快捷方式的監視器上啟動應用程式。 因此,放置應用程式的其中一種方式是在想要的監視器上擁有其快捷方式。
如果您使用 ShellExecute 或 ShellExecuteEx ,請提供 hWnd ,讓系統會在與呼叫應用程式相同的監視器上開啟任何新的視窗。
請注意,具有多個監視器的系統會稍微改變 MINMAXINFO 結構的值。