Delphi

Xakep, номер #044, стр. 044-058-1


Смена видеорежима

Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

По многочисленным просьбам сегодня мы научимся программно менять видеорежимы Windows. Помимо этого, я покажу, как вытаскивать из системы список возможных видеорежимов, чтобы ты случайно не выбрал невозможное для моника сочетание параметров.

Дизайним форму

Для примера нам понадобятся на форме один компонент ListBox и две кнопки. По нажатию первой кнопки мы будем выдирать из системы все возможные варианты видеорежимов и записывать их в ListBox. По нажатию второй кнопки мы будем делать активным режим, выделенный в списке ListBox. Можешь расположить все компоненты, как угодно, а можешь сделать, как я (см. рисунок 1).

Итак, на первой кнопке напиши что-нибудь типа "Перечислить видеорежимы", а на второй - "Установить видеорежим". Теперь прога выглядит более солидно, и можно приступать к шкодингу.

Прежде чем написать какой-то код, надо объявить массив из переменных типа TdevMode, в котором мы будем сохранять параметры найденных видеорежимов. Для этого находим раздел private и пишем в нем:

private

{ Private declarations }

modes:array[0..255] of TDevMode;

public

{ Public declarations }

Этим я объявил массив из 255 элементов типа TDevMode.

Перечисление режимов

Для начала создаем обработчик события OnClick для кнопки и пишем в нем следующий текст:

procedure TForm1.Button1Click(Sender: TObject);

var

i: Integer;

begin

ListBox1.Items.Clear;

i := 0;

while EnumDisplaySettings(nil, i, Modes[i]) do

begin

ListBox1.Items.Add(IntToStr(Modes[i].dmBitsPerPel)+' '+

IntToStr(Modes[i].dmPelsWidth)+' '+

IntToStr(Modes[i].dmPelsHeight)+' '+

IntToStr(Modes[i].dmDisplayFrequency));

Inc(i);

end;

end;

В первой строке кода я очищаю содержимое списка ListBox с помощью вызова ListBox1.Items.Clear.

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

Дальше я вызываю функцию EnumDisplaySettings, которая перечисляет доступные системе видеорежимы. У этой функции три параметра:

1. Устройство, для которого надо перечислять режимы. Здесь нужно что-то указывать только тогда, если у тебя несколько мониторов. Если ты простой смертный с одним моником, то можно смело указывать nil.

2. Здесь указываем индекс режима, который нам нужен. Я указываю переменную i, которая перед каждым вызовом будет увеличиваться на 1, а значит, мы будет каждый раз получать следующий по счету режим.

3. Переменная типа TDevMode, в которую нужно записать параметры режима. Сюда я каждый раз подставляю очередной элемент из массива.

Вызов функции происходит между операторами while и do:

while EnumDisplaySettings(nil, i, Modes[i]) do

Это значит, что пока результат вызова функции EnumDisplaySettings не станет ошибкой, будет выполняться последующий между begin и end цикл. В этом цикле я добавляю строку в список ListBox, в которой записаны параметры найденного режима, и увеличиваю счетчик i на единицу.

Когда я добавляю новый элемент в список ListBox, то в качестве строки я передаю следующую информацию:

Содержание  Вперед на стр. 044-058-2