Отслеживание изменений дисплея
Для отслеживания изменений необходимо создать обработчик для перехвата сообщения WM_DISPLAYCHANGE. Обычно данный приём используется в случае, если приложения использует в своей работе графику, и его необходимо перезагрузить для смены разрешения, разрядности цвета и т.д.
Code: |
... type TForm1 = class(TForm) ListBox1: TListBox; ... private procedure WMDisplayChange(var Message:TMessage); message WM_DISPLAYCHANGE; ... procedure TForm1.WMDisplayChange(var Message: TMessage); begin ShowMessage('Changes in display detected!'); inherited; end; |
При разработке приложений, которые затем будут использоваться на большом числе различных ПК очень полезно иметь возможность не только получения информации о текущем видеорежиме, но и возможность получить все доступные видеорежимы для данного ПК. Еще одна область, где используется переключение видеорежимов при написании игр без использования DirectX.
Получение списка видеорежимов
Получить видеорежимы можно серией вызовов EnumDisplaySettings. Функция EnumDisplaySettings возвращает информацию о видеорежиме, указанном в параметре IModeNode. Функции необходимо передать структуру типа TDevMode, в которую будет записана информация о видеорежиме. Данная структура имеет поля, характеризующие видеорежим: разрешение (dmPelsWidth, dmPelsHeight), количество битов цветности (dmBitsPerPel), частота обновления экрана (dmDisplayFrequency) и др.
function EnumDisplaySettings(lpszDeviceName: PWideChar; iModeNum: DWORD;
var lpDevMode: TdeviceMode): BOOL; stdcall;
Параметры
lpszDeviceName
Указатель на нуль-терминальную строку, определяющую экранное устройство, видеорежимы которого мы хотим получить. В Windows 95 and 98 (и в наших приложениях :)) ), lpszDeviceName должно быть равно Nil.
iModeNum
Номер видеорежима
lpDevMode
Структура, в которой будет возвращена информация о видеорежиме. Cтруктура довольно сложна и используется не только для видео устройств, но нам понадобятся только следующие ее поля.
Поле Описание
DmBitsPerPel
Количество бит на пиксел
DmPelsWidth
Ширина в пикселях
DmPelsHeight
Высота в пикселях
DmDisplayFlags
DM_GRAYSCALE - Черно-белое устройство
DM_INTERLACED - Черезстрочная развертка.
Если флаг не установлен, подразумевается построчная развертка
dmDisplayFrequency
Частота обновления экрана
DmPosition
Windows 98, Windows 2000: Номер монитора для конфигураций с несколькими мониторами
DmFields
Поле dmFields используется при смене видеорежима для указания, какие именно из параметров устройства мы хотим изменить. Каждый бит поля определяет необходимость смены одного из параметров. Возможные значения:
DM_BITSPERPEL - Изменить количество бит на пиксель на значение указанное в поле dmBitsPerPel.
DM_PELSWIDTH - Изменить ширинку экрана на значение указанное в поле dmPelsWidth.
DM_PELSHEIGHT - Изменить выстоу экрана на значение указанное в поле dmPelsHeight
DM_DISPLAYFLAGS - Изменить флаги.
DM_DISPLAYFREQUENCY - Изменить частоту обновления dmDisplayFrequency.
DM_POSITION - Windows 98, Windows 2000: изменить номер монитора.
Если lpDevMode равно nil, из реестра берется информация о видеорежиме установленном по умолчанию. Передавая в lpDevMode nil и в dwFlags 0 можно получить настройки текущего видеорежима.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!