Q&A

  • 해상도 관한 질문~들어와봐요~
프로그램을 실행을 시켜을때 현 디스플래이 해상도를 알아 보고 싶습니다.

또한 해상도 바꾸는 방법 예)800*600---->640*480이러한 형식을로 하는법

오빠들 부탁해요.....게임을 만드는데 꼭 필요해요....^.^

1  COMMENTS
  • Profile
    조규춘 2000.07.06 04:03
    온달 wrote:

    > 프로그램을 실행을 시켜을때 현 디스플래이 해상도를 알아 보고 싶습니다.

    > 또한 해상도 바꾸는 방법 예)800*600---->640*480이러한 형식을로 하는법





    > 오빠들 부탁해요.....게임을 만드는데 꼭 필요해요....^.^



    윽.~! 이름은 온달로 적어 놓구선 왠 오빠들인지? 쩝...

    위에 질문에 맞는 예제 입니다.

    unit Unit1;



    interface



    uses

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

    StdCtrls, Spin;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    SpinEdit1: TSpinEdit;

    Label1: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure FormDestroy(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]);



    Label1.Caption := Format('%d x %d',[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.





    행복하셔요 규춘올림