Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 744

/ вопрос закрыт /

Доброго времени суток, уважаемые эксперты!
Мне нужно чтоб моя программа в момент запуска меняла параметры дисплея на 32bit,800*600,60Гц.
Посоветуйте самый простой метод.



Спасибо.

Приложение:
  1. Delphi7, WINDOWS XP SP2


QWERYTY Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: 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

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

QWERYTY (статус: Посетитель), 8 февраля 2010, 18:18 [#24]:

Всем спасибо за помощь. Заработало!
От радости чуть голову не разбил о потолок.)))
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

30 мая 2011, 03:07: Вопрос закрыт (решение принял автор вопроса — QWERYTY): Вопрос исчерпан

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 23:16
Выполнено за 0.05 сек.