Q&A

  • 화면모드를 알아내는 방법
안녕하세요.

현재 화면 모드를 알아 내는 방법이 어떻게 되나요.

1  COMMENTS
  • Profile
    김영대 1999.05.17 20:54
    이호선 wrote:

    > 안녕하세요.

    > 현재 화면 모드를 알아 내는 방법이 어떻게 되나요.



    안녕하세요 김영대입니다

    아래 소스는 화면 모드를 읽고 변경하는 예제입니다



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    Spin, StdCtrls;



    type

    TForm1 = class(TForm)

    Memo1: TMemo;

    Button1: TButton;

    SpinEdit1: TSpinEdit;

    Label1: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    type

    PdmArray = ^TDmArray;

    TDmArray = array[0..0] of TDeviceMode;



    var

    Form1: TForm1;

    lpDmArray: PDmArray;

    NumModes: integer;



    implementation

    {$R *.DFM}



    procedure TForm1.FormCreate(Sender: TObject);

    var

    MyPC_DC: THandle; // Display context

    MyPC_Bits: Integer; // Bits per pixel

    MyPC_HRes: Integer; // Horizontal resolution

    MyPC_VRes: Integer; // Vertical resolution



    i: integer;

    dm : TDeviceMode;

    begin

    MyPC_DC := Canvas.Handle;

    MyPC_Bits := GetDeviceCaps(MyPC_DC, BITSPIXEL); // 각 pixel당 칼러의 비트수

    MyPC_HRes := GetDeviceCaps(MyPC_DC, HORZRES); // 화면의 폭(Width)의 비트수

    MyPC_VRes := GetDeviceCaps(MyPC_DC, VERTRES); // 화면의 높이(Height)의 비트수

    // 내 PC의 video mode 정보

    Label1.Caption := Format('%d bits, %d x %d',[MyPC_Bits, MyPC_HRes, MyPC_VRes]);



    // 현재 내 PC가 지원할 수 있는 video mode 를 구한다

    Memo1.Lines.Clear;

    NumModes := 0; // 첫번째 video mode의 번호(0번부터 시작)

    while True do

    begin

    // nil 이면 현재 표시장치(display device)를 나타냅니다

    if not EnumDisplaySettings(nil, NumModes, dm) then // False이면 더이상 없다

    Break;

    Memo1.Lines.Add('Mode ' +

    IntToStr(NumModes) + ': ' +

    IntToStr(dm.dmBitsPerPel) + ' Bits Per Pixel ' +

    IntToStr(dm.dmPelsWidth) + ' x ' +

    IntToStr(dm.dmPelsHeight));

    Inc(NumModes); // 다음번 video mode의 번호를 나타냅니다

    end;



    // 선택 가능한 mode의 최소값

    SpinEdit1.MinValue := 0;

    // NumModes에는 마지막 mode번호보다 1이 큰 mode의 갯수가 들어있음

    SpinEdit1.MaxValue := NumModes - 1;



    // TDeviceMode 를 배열요소로 NumModes 크기의 동적배열을 만든다

    // 위 type 선언문 "TDmArray = array[0..0] of TDeviceMode" 이 동작배열을

    // 만들기 위한 선언이며 아래와 같이 실제 메모리를 할당받는다

    // DELPHI 4.0 에서는 이런 일련의 동작을 하나로 통합한 동적배열을

    // 직접 지원하고 있음

    GetMem(lpDmArray, sizeof(TDeviceMode) * NumModes); // 배열의 메모리 할당

    FillChar(lpDmArray^, sizeof(TDeviceMode) * NumModes, #0); // 배열의 초기화



    // 동적배열에 mode정보를 저장(위의것은 화면에 보여주기 위해 읽은것임)

    for i := 0 to (NumModes - 1) do

    begin

    EnumDisplaySettings(nil, i, lpDmArray[i]);

    if (lpDmArray[i].dmBitsPerPel = MyPC_Bits) and

    (lpDmArray[i].dmPelsWidth = MyPC_HRes) and

    (lpDmArray[i].dmPelsHeight = MyPC_VRes)

    then

    SpinEdit1.Value := i;

    end;

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var

    ReturnVal : LongInt;

    begin

    // 선택한 모드로 화면 변경

    ReturnVal := ChangeDisplaySettings(lpDmArray[SpinEdit1.Value],

    CDS_UPDATEREGISTRY);



    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.