|
Вопрос # 3 744/ вопрос закрыт / |
|
Доброго времени суток, уважаемые эксперты!
Мне нужно чтоб моя программа в момент запуска меняла параметры дисплея на 32bit,800*600,60Гц.
Посоветуйте самый простой метод.
Спасибо.
 |
Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 7 февраля 2010, 01:04
Состояние вопроса: закрыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, Никоноров К.С.!
Ставим две кнопки - одна будет делать нужный режим, другая - возвращать всё обратно.
В обработчик первой кнопки прописываем:
procedure TForm1.Button1Click(Sender: TObject);
var
lpDevMode: TDeviceMode;
dwFlags: DWORD;
begin
// получим информацию о текущем режиме:
EnumDisplaySettings(Nil, 0, lpDevMode);
// установим свои параметры:
lpDevMode.dmBitsPerPel:=32; // 32 бита
lpDevMode.dmPelsWidth:=800; // ширина
lpDevMode.dmPelsHeight:=800; // высота
lpDevMode.dmDisplayFrequency:=60; // частота
dwFlags:=CDS_FULLSCREEN; // изменение режима временно, запоминать не надо
// будет выдано сообщение об успешности смены режима:
case ChangeDisplaySettings(lpDevMode, dwFlags) of
DISP_CHANGE_SUCCESSFUL: ShowMessage('Изменения прошли успешно.');
DISP_CHANGE_RESTART: ShowMessage(' Необходима перезагрузка для вступления изменений в силу');
DISP_CHANGE_BADFLAGS: ShowMessage(' Передан неверный набор флагов');
DISP_CHANGE_BADPARAM: ShowMessage(' Неверные параметры.');
DISP_CHANGE_FAILED: ShowMessage(' Драйвер видеоустройства не смог установить режим');
DISP_CHANGE_BADMODE: ShowMessage(' Видеорежим не поддерживается');
DISP_CHANGE_NOTUPDATED: ShowMessage(' Windows NT/2000: Ошибка записи в реестр');
end;
end;
Вторая кнопка, которая возвращает всё "обратно":
procedure TForm1.Button2Click(Sender: TObject);
var
lpDevMode: TDeviceMode;
dwFlags: DWORD;
begin
// вернём всё обратно
// сначала получим параметры текущего режима
EnumDisplaySettings(Nil, 0, lpDevMode);
// установим флаг в 0 - т.е. выйдем из "временного режима", в который мы
// вошли, щёлкнув по предыдущей кнопке
dwFlags:=0;
ChangeDisplaySettings(lpDevMode, dwFlags);
end;
Ну и поставим на форму таймер, в который пропишем:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button2.Click;
end;
У таймера пропишем время срабатывания что-нибудь около 30 сек.
Впрочем, таймер можно бы и не писать, но если данный режим не поддерживается, то экран может стать чёрным и поможет лишь перезагрузка компа. А так - через 30 сек всё вернётся обратно.
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 7 февраля 2010, 14:14
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 24; последнее сообщение — 8 февраля 2010, 18:18; участников в обсуждении: 5.
Страницы: [« Предыдущая] [1] [2]
|
Егор (статус: 10-ый класс), 7 февраля 2010, 21:36 [#21]:
1) CDS_CDS_RESET - убираем одно CDS, т.е. надо просто CDS_RESET. Вообще, везде CDS лишь единожды - моя опечатка, извиняюсь.
2) EnumDisplaySettings(Nil, 0, lpDevMode) - нужен! у нас есть структура lpDevMode, в которой до хрена полей (черно-белое ли устройство, черезстрочная/построчная развертка, номер монитора, и т.п.). Или все их ручками хочешь заполнять?
3) Про destroy - надо ли возвращать разрешение экрана обратно? я так понял, что нет. Тогда нужна комбинация флагов CDS_GLOBAL or CDS_UPDATEREGISTRY или просто CDS_UPDATEREGISTRY.
Если же это разрешение временно и после завершения нужно вернуть всё назад, то в качестве флага сначала ставим CDS_FULLSCREEN, а затем, для возврата, ставим 0.
На эти вопросы есть ответы, как я и говорил, в статье про получение и установке видеорежимов в Windows. Мои же ответы не являются полными, а содержат лишь ту информацию, которая была запрошена.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 7 февраля 2010, 21:38 [#22]:
Undeclared identifier:'CDS_CDS_RESET'
в переводе на русский: "необъявленный идентификатор CDS_CDS_RESET", т.е. либо ошибка в написании, либо не подключен какой-либо модуль или библиотека. В нашем случае - просто опечатка.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Interventor (статус: Посетитель), 7 февраля 2010, 22:42 [#23]:
Здравствуйте Никоноров К.С.
Я в procedure TForm1.FormCreate(Sender: TObject) скопировал код для TForm1.Button1Click от var до второго end вместе с сообщениями об ошибках.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
lpDevMode: TDeviceMode;
dwFlags: DWORD;
begin
// получим информацию о текущем режиме:
EnumDisplaySettings(Nil, 0, lpDevMode);
// установим свои параметры:
lpDevMode.dmBitsPerPel:=32; // 32 бита
lpDevMode.dmPelsWidth:=1280; // ширина
lpDevMode.dmPelsHeight:=720; // высота
lpDevMode.dmDisplayFrequency:=60; // частота
dwFlags:=CDS_FULLSCREEN; // изменение режима временно, запоминать не надо
// будет выдано сообщение об успешности смены режима:
case ChangeDisplaySettings(lpDevMode, dwFlags) of
DISP_CHANGE_SUCCESSFUL: ShowMessage('Изменения прошли успешно.');
DISP_CHANGE_RESTART: ShowMessage(' Необходима перезагрузка для вступления изменений в силу');
DISP_CHANGE_BADFLAGS: ShowMessage(' Передан неверный набор флагов');
DISP_CHANGE_BADPARAM: ShowMessage(' Неверные параметры.');
DISP_CHANGE_FAILED: ShowMessage(' Драйвер видеоустройства не смог установить режим');
DISP_CHANGE_BADMODE: ShowMessage(' Видеорежим не поддерживается');
DISP_CHANGE_NOTUPDATED: ShowMessage(' Windows NT/2000: Ошибка записи в реестр');
end;
end;
end.
|
|
QWERYTY (статус: Посетитель), 8 февраля 2010, 18:18 [#24]:
Всем спасибо за помощь. Заработало!
От радости чуть голову не разбил о потолок.)))
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
30 мая 2011, 03:07: Вопрос закрыт (решение принял автор вопроса — QWERYTY): Вопрос исчерпан
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|