Функция EnumDisplayMonitors (winuser.h)
Функция EnumDisplayMonitors перечисляет мониторы отображения (включая невидимые псевдомониторы, связанные с драйверами зеркального отображения), которые пересекают область, сформированную пересечением указанного прямоугольника обрезки и видимой области контекста устройства. EnumDisplayMonitors вызывает определяемую приложением функцию обратного вызова MonitorEnumProc один раз для каждого перечисленного монитора. Обратите внимание, что GetSystemMetrics (SM_CMONITORS) учитывает только мониторы дисплея.
Синтаксис
BOOL EnumDisplayMonitors(
[in] HDC hdc,
[in] LPCRECT lprcClip,
[in] MONITORENUMPROC lpfnEnum,
[in] LPARAM dwData
);
Параметры
[in] hdc
Дескриптор контекста отображаемого устройства, который определяет видимую интересующую область.
Если этот параметр имеет значение NULL, параметр hdcMonitor , переданный функции обратного вызова, будет иметь значение NULL, а видимой интересующей областью является виртуальный экран, охватывающий все дисплеи на рабочем столе.
[in] lprcClip
Указатель на структуру RECT , задающую прямоугольник обрезки. Интересующая область представляет собой пересечение прямоугольника обрезки с видимой областью, заданной hdc.
Если hdc не равно NULL, координаты прямоугольника обрезки будут относительны к источнику hdc. Если hdc имеет значение NULL, координаты являются координатами виртуального экрана.
Этот параметр может иметь значение NULL , если вы не хотите обрезать регион, заданный hdc.
[in] lpfnEnum
Указатель на функцию обратного вызова, определяемую приложением MonitorEnumProc .
[in] dwData
Определяемые приложением данные, которые EnumDisplayMonitors передают непосредственно в функцию MonitorEnumProc .
Возвращаемое значение
Если функция выполняется успешно, возвращается ненулевое значение.
Если функция выполняется неудачно, возвращается нулевое значение.
Комментарии
Существует две причины для вызова функции EnumDisplayMonitors :
- Вы хотите оптимально использовать контекст устройства, охватывающий несколько мониторов дисплея, и мониторы имеют разные форматы цветов.
- Вы хотите получить прямоугольник дескриптора и положения для одного или нескольких мониторов дисплея.
Вам не нужно использовать функцию EnumDisplayMonitors , когда окно охватывает мониторы с различными форматами цвета. Вы можете продолжать рисовать, предполагая, что весь экран имеет цветовые свойства основного монитора. Окна будут выглядеть нормально. EnumDisplayMonitors просто позволяет сделать их лучше.
Задание для параметра hdcзначения NULL позволяет использовать функцию EnumDisplayMonitors для получения прямоугольника дескриптора и положения для одного или нескольких мониторов дисплея. В следующей таблице показано, как четыре сочетания значений HDC и hdclip, отличных от NULL, влияют на поведение функции EnumDisplayMonitors.
Hdc | lprcRect | Поведение EnumDisplayMonitors |
---|---|---|
NULL | NULL | Перечисляет все мониторы отображения. Функция обратного вызова получает HDC NULL . |
NULL | отличное от NULL | Перечисляет все мониторы отображения, которые пересекаются с прямоугольником обрезки. Используйте виртуальные экранные координаты для прямоугольника обрезки. Функция обратного вызова получает HDC NULL . |
отличное от NULL | NULL | Перечисляет все мониторы отображения, которые пересекаются с видимой областью контекста устройства. Функция обратного вызова получает дескриптор контроллера домена для конкретного монитора дисплея. |
отличное от NULL | отличное от NULL | Перечисляет все мониторы отображения, которые пересекаются с видимой областью контекста устройства и прямоугольником обрезки. Используйте координаты контекста устройства для прямоугольника обрезки. Функция обратного вызова получает дескриптор контроллера домена для конкретного монитора дисплея. |
Примеры
Чтобы зарисовать в ответ на сообщение WM_PAINT, используя возможности каждого монитора, можно использовать следующий код в процедуре окна:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
EnumDisplayMonitors(hdc, NULL, MyPaintEnumProc, 0);
EndPaint(hwnd, &ps);
Чтобы закрасить верхнюю половину окна с помощью возможностей каждого монитора, можно использовать следующий код:
GetClientRect(hwnd, &rc);
rc.bottom = (rc.bottom - rc.top) / 2;
hdc = GetDC(hwnd);
EnumDisplayMonitors(hdc, &rc, MyPaintEnumProc, 0);
ReleaseDC(hwnd, hdc);
Чтобы закрасить весь виртуальный экран оптимально для каждого монитора, можно использовать следующий код:
hdc = GetDC(NULL);
EnumDisplayMonitors(hdc, NULL, MyPaintScreenEnumProc, 0);
ReleaseDC(NULL, hdc);
Чтобы получить сведения обо всех мониторах дисплея, используйте следующий код:
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | winuser.h (включая Windows.h) |
Библиотека | User32.lib |
DLL | User32.dll |
Набор API | ext-ms-win-ntuser-sysparams-ext-l1-1-1 (представлено в Windows 10, версия 10.0.14393) |