| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Screen |
| Автор: DriveSoftware 11.9.2003, 12:23 |
| HI ! Каким образом можно получить список все доступных видео режимов (разрешение - цвет)? |
| Автор: Akella 11.9.2003, 12:51 |
| Кол-во цветов текущего режима GetDeviceCaps(Form1.Canvas.Handle, BITSPIXEL) * GetDeviceCaps(Form1.Canvas.Handle, PLANES) Для получения общего количества битов, используемых для получения цвета используются следующие значения. 1 = 2 colors bpp 4 = 16 colors bpp 8 = 256 colors bpp 15 = 32768 colors (возвращает 16 на большинстве драйверов) bpp 16 = 65535 colors bpp 24 = 16,777,216 colors bpp 32 = 16,777,216 colors (то же, что и 24) bpp Вы можете использовать: NumberOfColors := (1 shl (GetDeviceCaps(Form1.Canvas.Handle, BITSPIXEL) * GetDeviceCaps(Form1.Canvas.Handle, PLANES)); для подсчета общего количества используемых цветов. |
| Автор: Akella 11.9.2003, 12:53 |
| Можно поменять режимы дисплея: Нужно использовать EnumDisplaySettings() для получения полного списка доступных режимов. Затем ChangeDisplaySettings() - для изменения текущего режима. Обрати внимание, что многие драверы не меняют режим без перезагрузки. -------------------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type PdmArray = ^TDmArray; TDmArray = array[0..0] of TDeviceMode; type TForm1 = class(TForm) Memo1: TMemo; SpinEdit1: TSpinEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private lpDmArray : PDmArray; NumModes : integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i : integer; // auto-initialized to zero MoreModes : bool; dm : TDeviceMode; begin Memo1.Lines.Clear; MoreModes := True; while MoreModes do begin MoreModes := EnumDisplaySettings(nil, i, dm); Memo1.Lines.Add('Mode ' + IntToStr(i) + ': ' + IntToStr(dm.dmBitsPerPel) + ' Bits Per Pixel ' + IntToStr(dm.dmPelsWidth) + ' x ' + IntToStr(dm.dmPelsHeight)); Inc(i); end; NumModes := i; SpinEdit1.MinValue := 0; SpinEdit1.MaxValue := NumModes; GetMem(lpDmArray, sizeof(TDeviceMode) * NumModes); FillChar(lpDmArray^, sizeof(TDeviceMode) * NumModes, #0); {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} for i := 0 to (NumModes - 1) do EnumDisplaySettings(nil, i, lpDmArray[i]); {$IFDEF CKRANGE} {$UNDEF CKRANGE} {$R+} {$ENDIF} end; procedure TForm1.Button1Click(Sender: TObject); var ReturnVal : LongInt; begin {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} ReturnVal := ChangeDisplaySettings(lpDmArray[SpinEdit1.Value], CDS_UPDATEREGISTRY); {$IFDEF CKRANGE} {$UNDEF CKRANGE} {$R+} {$ENDIF} with Memo1.Lines do begin case ReturnVal of DISP_CHANGE_SUCCESSFUL: Add('DISP_CHANGE_SUCCESSFUL'); DISP_CHANGE_RESTART : Add('DISP_CHANGE_RESTART'); DISP_CHANGE_BADFLAGS : Add('DISP_CHANGE_BADFLAGS'); DISP_CHANGE_FAILED : Add('DISP_CHANGE_FAILED'); DISP_CHANGE_BADMODE : Add('DISP_CHANGE_BADMODE'); DISP_CHANGE_NOTUPDATED: Add('DISP_CHANGE_NOTUPDATED'); end; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeMem(lpDmArray, sizeof(TDeviceMode) * NumModes); end; end. |
| Автор: dm9 12.9.2003, 13:49 |
| EnumDisplaySettings??? |
| Автор: Akella 12.9.2003, 14:19 |
| Эта функция получает информацию о графическом режиме дисплея. Можно получить информацию для всех графических режимов делая серию вызовов. Запусти Delphi, далее меню Help>Windows SDK и найди эту функцию. А в проект попробуй включить ссылки на WinTypes, WinProcs (я точно не помню) |
| Автор: Baa 12.9.2003, 15:09 |
| Насколько я знаю, WinTypes и WinProcs - это пережитки прошлого, начиная с дельфи 3(или может раньше, но я начинал именно с неё) используется юнит Windows |