Размещение объектов на нескольких мониторах отображения

Окно или меню, размещенные на нескольких мониторах, приводит к нарушению визуального представления для зрителя. Чтобы свести к минимуму эту проблему, система отображает меню и новые и развернутые окна на одном мониторе. В следующей таблице показано, как выбирается монитор.

Объект Расположение
window CreateWindow(Ex) отображает на мониторе окно, содержащее большую часть окна. Разворачивается на мониторе, который содержит большую часть окна, прежде чем оно было свернуто.
Сочетание клавиш ALT-TAB отображает окно на мониторе с активным в данный момент окном.
собственное окно на том же мониторе, что и его владелец.
Submenu Отображается на мониторе, содержающем большую часть соответствующего пункта меню.
контекстное меню Отображается на мониторе, где произошел щелчок правой кнопкой мыши.
раскрывающийся список Отображается на мониторе, который содержит прямоугольник поля со списком.
диалоговое окно Отображается на мониторе окна, которому он принадлежит. Если он определен с DS_CENTERMOUSE стилем, он отображается на мониторе с помощью мыши.
Если у него нет владельца, а активное окно и диалоговое окно находятся в одном приложении, диалоговое окно отображается на мониторе текущего активного окна.
Если диалоговое окно не имеет владельца и активное окно не находится в том же приложении, что и диалоговое окно, диалоговое окно отображается на основном мониторе.
окно сообщения Отображается на мониторе окна, которому он принадлежит.

 

Если окно перестраивает два монитора и один из мониторов перемещается, система размещает окно на мониторе, который содержит большую часть исходного окна.

Приложению также обычно требуется размещать объекты. Например, может потребоваться создать окно на том же мониторе, что и другое окно.

Размещение объекта в системе с несколькими мониторами

  1. Определите соответствующий монитор.
  2. Получение координат для монитора.
  3. Расположите объект с помощью координат.

Как правило, объект размещается либо на основном мониторе, либо на мониторе, на который уже есть объект. Чтобы определить монитор для заданной точки, прямоугольника или окна, используйте MonitorFromPoint, MonitorFromRect и MonitorFromWindow.

Чтобы получить координаты для монитора, используйте GetMonitorInfo, который предоставляет как рабочую область, так и весь прямоугольник монитора. Обратите внимание, что SM_CXSCREEN и SM_CYSCREEN всегда ссылаются на основной монитор, а не на монитор, на котором отображается ваше приложение. Кроме того, избегайте SM_xxVIRTUALSCREEN, так как это центрируется на виртуальном экране, а не на мониторе.

Для выравнивания диалоговых окон в рабочей области окна используйте стиль DS_CENTER. Чтобы вывести диалоговое окно в центр окна приложения, используйте командлет GetWindowRect. Windows автоматически ограничивает меню и диалоговые окна монитором. Однако могут возникнуть проблемы с пользовательскими меню, настраиваемыми раскрывающимся списком, настраиваемыми палитрами инструментов и сохраненной позицией приложения.

Пример правильного размещения объектов см. в разделе Размещение объектов при настройке нескольких дисплеев.

Использование SM_CXSCREEN и SM_CYSCREEN для определения расположения панели инструментов рабочего стола приложения (также называемой панелью приложений) ограничивает панель приложений основным монитором. Чтобы панель приложений была размещена на любом краю любого монитора, используйте соответствующие системные метрики для вычисления краев мониторов. Кроме того, используйте макросы GET_X_LPARAM и GET_Y_LPARAM для извлечения координат. В противном случае знак координат может быть неправильным. Эти макросы включены в Windowsx.h.

Размер полноэкранного окна должен изменяться при перемещении между мониторами с разными разрешениями. Для этого приложение должно проверка, в каком окне оно находится, с помощью MonitorFromWindow или MonitorFromPoint , а затем использовать GetMonitorInfo для получения размера монитора. В качестве альтернативы можно использовать HMONITOR из функции DirectDrawEnumerateEx . Затем используйте SetWindowPos , чтобы расположить и изменить размер окна для покрытия монитора.

Развернутое окно не охватывает панель задач со свойством "Всегда сверху". Однако в полноэкранном окне отображается панель задач, например в слайд-шоу и играх Microsoft PowerPoint.

Чтобы сохранить и позже восстановить положение окна при выходе из приложения, используйте функции GetWindowPlacement и SetWindowPlacement . Однако проверка, что позиция по-прежнему действительна перед ее использованием, так как монитор мог быть перемещен или удален из системы. Приложение отображает окно на основном мониторе, если HMONITOR окна является недопустимым.

Система пытается запустить на мониторе приложение, содержащее ярлык. Таким образом, один из способов размещения приложения — разместить его ярлык на нужном мониторе.

Если вы используете ShellExecute или ShellExecuteEx , предоставьте hWnd , чтобы система открывала все новые окна на том же мониторе, что и вызывающее приложение.

Обратите внимание, что значения структуры MINMAXINFO немного изменены для системы с несколькими мониторами.