Главная страница | назад





Article #15735: Changing the display mode settings in code.

 Question and Answer Database

FAQ735D.txt   Changing the display mode settings in code.
Category   :Windows API
Platform    :All
Product    :All 32 bit  

Question:
How do I change the display mode settings in code?


Answer:
You can use the Windows API function EnumDisplaySettings() 
to get a list of valid mode settings, and use the Windows 
API function ChangeDisplaySettings() to actually change the 
display setting. Note that many drivers will not perform the 
reset without rebooting the computer, even though they are 
capable of doing so.

Example:

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.


7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99