Установка и изменение разрешения и глубины цвета из программы
Установка и изменение разрешения и глубины цвета из программы
Установка и изменение разрешения и глубины цвета из программы Источник: http://proglib.ru Иногда бывает полезно изменять режим видеоадаптера прямо из программы. Для этого можно воспользоваться функциями EnumDisplaySettings и ChangeDisplaySettings Windows API. 1. Получение списка доступных режимов. Воспользуемся функцией EnumDisplaySettings. В качестве параметров этой функции передаются номер режима и переменная типа TDevMode, куда записывается информация о допустимых режимах монитора. В частности, тип TDevMode содержит поля, хранящие разрешение (dmPelsWidth, dmPelsHeight), глубину цвета (dmBitsPerPel), частоту (dmDisplayFrequency) и другие. Итак, procedure TForm1.FormCreate(Sender: TObject); var i : Integer; DevMode : TDevMode; begin i:=0; while EnumDisplaySettings(nil,i,DevMode) do begin with Devmode do ListBox1.Items.Add (Format(?%dx%d %d Colors?, [dmPelsWidth,dmPelsHeight,1 shl dmBitsperPel])); Inc(i); end; 2. Установка нужных режимов. Теперь, когда у нас есть список допустимых режимов, можно попробовать установить один из них. Для этого в Windows API существует функция ChangeDisplaySettings, изменяющая режим видеоадаптера и обеспечивающая изменения в реестре Windows. Для того, чтобы уже запущенные программы узнали об изменении видеорежима, пошлем об этом сообщение (SendMessage) procedure TForm1.Button1Click(Sender: TObject); var DevMode : TDeviceMode; liRetValue : Longint; begin if EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode) then liRetValue := ChangeDisplaySettings(DevMode, CDS_UPDATEREGISTRY); SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, SPI_SETNONCLIENTMETRICS, 0); end; Замечание: иногда, особенно если у вас старые драйвера, может потребоваться перезагрузка компьютера. 3. Наша программа тоже должна обнаруживать изменения видеорежима. Особенно это важно для графических программ. Создадим обработчик сообщения WM_DISPLAYCHANGE ... 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;