unit VidMode;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Run: TButton;
Test: TButton;
Label2: TLabel;
ComboBox1: TComboBox;
procedure RunClick(Sender: TObject);
procedure TestClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
Modes : Array[0..255] of TDevMode;
implementation
{$R *.DFM}
procedure TForm1.RunClick(Sender: TObject);
var
DC : THandle; //
Bits : Integer; //
HRes : Integer; //
VRes : Integer; //
DM : TDevMode; //
ModeNum : LongInt; //
Ok : Bool;
I : Byte;
begin
//
DC := Canvas.Handle;
Bits := GetDeviceCaps(DC, BITSPIXEL);
HRes := GetDeviceCaps(DC, HORZRES);
VRes := GetDeviceCaps(DC, VERTRES);
Edit1.Text := Format('%d x %d, %d bits',[HRes, VRes, Bits]);
ModeNum := 0;
EnumDisplaySettings(Nil, ModeNum, DM);
Modes[ModeNum] := DM; // Add to array
Ok := True;
While Ok do
Begin
Inc(ModeNum);
Ok := EnumDisplaySettings(Nil, ModeNum, DM);
Modes[ModeNum] := DM; // Add to array
End;
// Now ModeNum contains # of supported modes
For I := 0 to ModeNum-1 do
Begin
ComboBox1.Items.Add(Format('%d x %d, %d bits',
[TDevMode(Modes[I]).dmPelsWidth,
TDevMode(Modes[I]).dmPelsHeight,
TDevMode(Modes[I]).dmBitsPerPel]));
ComboBox1.ItemIndex := 0;
End;
end;
procedure TForm1.TestClick(Sender: TObject);
var
NewMode : TDevMode;
ChResult : LongInt;
Msg : String;
// Mode is TDevMode(Modes[ListBox1.ItemIndex])
begin
NewMode := TDevMode(Modes[ComboBox1.ItemIndex]);
NewMode.dmDisplayFrequency := 0;
NewMode.dmDisplayFlags :=
DM_BITSPERPEL AND
DM_PELSWIDTH AND
DM_PELSHEIGHT AND
DM_DISPLAYFLAGS;
// In Win95 we should use CDS_UPDATEREGISTRY to change
// number of bits per pixel and resolution. Also we need
// to restart the computer to take effect of new settigs
ChResult := ChangeDisplaySettings(NewMode, CDS_UPDATEREGISTRY);
Msg := '';
Case ChResult of
DISP_CHANGE_SUCCESSFUL : Msg := 'Success';
DISP_CHANGE_RESTART : Msg := 'Restart';
DISP_CHANGE_BADFLAGS : Msg := 'Bad Flags';
DISP_CHANGE_FAILED : Msg := 'Failed';
DISP_CHANGE_BADMODE : Msg := 'Bad Mode';
DISP_CHANGE_NOTUPDATED : Msg := 'Not updated';
End;
ShowMessage(Msg);
end;
end.
|