Q&A

  • 아까 해상도 관련 질문한 사람인데요.
우선 답변해주신 '우연짱'님께 감사드립니다.

또 한가지 질문할게있어서 다시 글올립니다.

아까 말씀드렸다시피 노트북 해상도가 1024X768이 최대라 대부분

프로그램이 800X600으로 코딩되어있습니다.

근데 이 프로그램을 실행할때 현재 해상도에 맞게 스케일이 바뀌도록

할 수 있을까요?

예를 들어 800X600 해상도의 프로그램을 1024X768의 해상도에서 실행하면

그 크기에 맞게 프로그램 전체 콤포넌트배치등이 조절되게요.

예전에 스케일로 어떻게 하는걸 보긴했는데 찾을수가 없군요.

폼이 여러개라 프로젝트단위에서 한꺼번에 조정가능하면 더욱 좋겠지만

그게 아니더라도 각각의 폼이 실행될때 조정되도 좋아요.

잘 부탁드립니다.
3  COMMENTS
  • Profile
    바다를향해 2003.05.26 19:06
    const
    ScreenWidth:LongInt=1024; //제작된프로그램의 기본해상도의 width
    ScreenHeight:LongInt=768; //제작된프로그램의 기본해상도의 height

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Scaled:=true;
    if Screen.Width<>ScreenWidth then
    begin
    Width:=LongInt(Width)*LongInt(Screen.Width) div ScreenWidth;
    Height:=LongInt(Height)*LongInt(Screen.Height) div ScreenHeight;
    ScaleBy(Screen.Width, ScreenWidth);
    end;
    end;

    팁란에 있는 내용인데여.....답글로 함 달아 봅니다...
    즐건하루....^^;;
  • Profile
    우연짱 2003.05.24 19:36
    실행되거나 활성화될때, 해상도를 바꾸시면 어떨까요?

    --;; ..) 해상도 예젭니다

    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.


  • Profile
    이종직 2003.05.24 21:50
    답변 감사합니다.

    해상도를 컨트롤하니깐 꽤나 복잡하군요...ㅎㅎ

    근데 저렇게 못하는 이유가 하나 있습니다.

    LCD모니터에서 구동되는 프로그램이라 화면이 깨끗하지 않아요.

    예전에는 작은 LCD모니터에서 돌려서 해상도가 낮았지만 요즘엔

    모두 15인치 이상의 모니터가 나와서리....-_-a

    (장비 프로그램이거든요....)