Delphi

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


Modes[i].dmBitsPerPel - глубина (количество бит на пиксель) цвета найденного режима.

Modes[i].dmPelsWidth - ширина экрана.

Modes[i].dmPelsHeight - высота экрана.

Modes[i].dmDisplayFrequency - частота развертки.

Проверим!!!

Можешь теперь запустить этот промежуточный вариант нашей проги и нажать на кнопку "Перечислить видеорежимы". Список ListBox должен заполниться строками, содержащими информацию о найденных видеорежимах (рисунок 2).

Все строки разбиты как бы на четыре колонки:

1. Глубина (количество бит на пиксель) цвета найденного режима.

2. Ширина экрана.

3. Высота экрана.

4. Частота развертки.

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

По нажатию второй кнопки "Смена режима" мы должны установить выделенный в списке режим. Для этого по нажатию второй кнопки пишем следующий код:

procedure TForm1.Button2Click(Sender: TObject);

begin

Modes[ListBox1.ItemIndex].dmFields := DM_BITSPERPEL or

DM_PELSWIDTH or DM_PELSHEIGHT or

DM_DISPLAYFLAGS or DM_DISPLAYFREQUENCY;

ChangeDisplaySettings(Modes[ListBox1.ItemIndex], CDS_UPDATEREGISTRY);

end;

ListBox1.ItemIndex - указывает на выделенный элемент в списке. Это значит, что для того, чтобы найти нужную структуру для выделенного элемента, в массиве Modes надо записать Modes[ListBox1.ItemIndex]. Все достаточно просто, потому что элементы в списке ListBox1 находятся в том же порядке, что и соответствующие структуры TDevMode в массиве Modes.

Прежде чем менять видеорежим, надо в структуре Modes заполнить свойство dmFields, в котором указывается, что именно менять. Здесь ты можешь указать сочетание следующих флагов:

1. DM_BITSPERPEL - будет меняться количество бит на пиксель.

2. DM_PELSWIDTH - будет меняться ширина экрана.

3. DM_PELSHEIGHT - будет меняться высота экрана.

4. DM_DISPLAYFREQUENCY - будет меняться частота развертки.

5. DM_DISPLAYFLAGS - изменить флаги дисплея.

Если ты хочешь поменять только количество бит на пиксель (глубину цвета), то в свойство dmFields достаточно указать только DM_BITSPERPEL. Я буду менять все, поэтому перечислил все флаги через оператор "or", который объединяет все в одно целое.

После заполнения этого свойства можно вызывать процедуру ChangeDisplaySettings. У нее два параметра:

1. Структура типа TdevMode.

2. Флаги.

В качестве флага можно указать одно из следующих значений:

1. Ноль - если просто поставить ноль, то разрешение экрана изменится динамически.

2. CDS_UPDATEREGISTRY - в этом случае разрешение также изменится динамически, но с обновлением параметров в реестре.

3. CDS_TEST - если указать этот флаг, то произойдет только тест возможности переключения видеорежима. Реального переключения не будет.

Побочный эффект

Очень интересный эффект происходит при смене видеорежима, если указать в качестве флага 0. В этом случае режим меняется, но окна не реагируют на эту смену и остаются в том же положении. Посмотри на рисунок 3, на котором я сменил режим на меньший и при этом исчезла панель Windows с кнопкой "Пуск". Она просто не отреагировала на смену режима. На рисунке 4 показан экран, на котором я, наоборот, сменил режим на больший, и тут также панель не отреагировала и осталась на много выше нижней части экрана.

Назад на стр. 044-058-1  Содержание  Вперед на стр. 044-058-3