::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-04 21:40:49, Hit : 4656, Vote : 1277
 프로그램에서 화면모드 변경하기

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.






91   [일반/컴포넌트] ListBox의 item을 mouse로 이동시키기  김영대 2003/03/04 4052 1165
90   [일반/컴포넌트] 비트연산 (bit-wise manipulation)  김영대 2003/03/04 5377 1626
89   [일반/컴포넌트] 6485 -> 64850000 or 00006485  김영대 2003/03/04 3865 1090
88   [일반/컴포넌트] ListBox의 내용을 파일로 저장하고 불러오기  김영대 2003/03/04 4178 1165
87   [윈도우즈 API] 윈도우즈 탐색기의 파일찾기 화면 띄우기  김영대 2003/03/04 4705 1395
86   [시스템] PrintScreen 키가 눌렸는지 검사하기  김영대 2003/03/04 4268 1329
85   [일반/컴포넌트] DateTimePicker 의 표시형식(format) 바꾸기  김영대 2003/03/04 6190 1326
84   [윈도우즈 API] 작업표시줄이 자동 숨김인지 검사  김영대 2003/03/04 5014 1326
83   [윈도우즈 API] 클립보드의 내용을 파일로 저장하기  김영대 2003/03/04 4427 1294
82   [일반/컴포넌트] 문자열의 word 갯수 세기  김영대 2003/03/04 4168 1123
81   [일반/컴포넌트] 문자열 찾아서(Search) 바꾸기(Replace)  김영대 2003/03/04 4028 1204
80   [일반/컴포넌트] LZExpand를 사용한 파일 복사하기  김영대 2003/03/04 3884 1165
  [시스템] 프로그램에서 화면모드 변경하기  김영대 2003/03/04 4656 1277
78   [윈도우즈 API] 시스템 메뉴에 menu item 추가하기  김영대 2003/03/04 4139 1240
77   [윈도우즈 API] 윈도우즈 재부팅하고 프로그램 실행하기  김영대 2003/03/04 4228 1351
76   [일반/컴포넌트] TStatusBar 의 각 Panel의 폰트 바꾸기  김영대 2003/03/04 5546 1834
75   [일반/컴포넌트] StringGrid의 Column의 크기(width) 자동 조절  김영대 2003/03/04 5919 1150
74   [일반/컴포넌트] ComboBox 가 dropped 상태인지 검사  김영대 2003/03/04 3884 1157
73   [일반/컴포넌트] Edit의 임의의 위치에 커서(캐럿) 보내기  김영대 2003/03/04 4133 1186
72   [윈도우즈 API] 폼의 테두리(frame) 그리기  김영대 2003/03/04 4792 1220
71   [윈도우즈 API] Hook 을 사용한 커서(캐럿)모양 바꾸기  김영대 2003/03/04 4411 1174
70   [일반/컴포넌트] ComboBox 가 drop down되었을때의 실제 크기는 얼마 ?  김영대 2003/03/04 4175 1194
69   [윈도우즈 API] Memo 에 임의의 tab stops 설정하기  김영대 2003/03/04 3951 1261
68   [일반/컴포넌트] 주어진 문자열에 잘못된 숫자값이 들어있는지 검사  김영대 2003/03/04 4040 1162
67   [시스템] 내 PC에 사운드카드가 있는지 검사  김영대 2003/03/04 6595 1901
66   [윈도우즈 API] 특정 folder 가 open된 탐색기 실행하기  김영대 2003/03/04 4873 1463
65   [윈도우즈 API] Windows Desktop에 직접 그림을 그리고(draw) 지우기(refresh)  김영대 2003/03/04 4577 1289
64   [시스템] DOS의 환경변수를 Memo로 읽어오기  김영대 2003/03/04 4251 1250
63   [일반/컴포넌트] 너무 많은 메뉴항목 (메뉴 분리하기)  김영대 2003/03/04 3841 1117
62   [시스템] PC의 시스템 시간/날짜 바꾸기  김영대 2003/03/04 4335 1127
61   [윈도우즈 API] 폼을 최상위로 설정 및 해제  김영대 2003/03/04 5750 2052
60   [시스템] Printer Margins 얻기  김영대 2003/03/04 4016 1231
59   [시스템] 여러 프로세스간에 자료 공유하기  김영대 2003/03/04 4861 1253
58   [시스템] 현재 내 PC의 비디오 정보  김영대 2003/03/04 4401 1169
57   [윈도우즈 API] 윈도우즈의 임시디렉토리명 알아내기  김영대 2003/03/04 4493 1214
56   [윈도우즈 API] 임시로 만든 파일 꼭 지우기  김영대 2003/03/04 6128 1737
55   [데이터베이스] 필드의 데이터 타입을 알아내기  김영대 2003/03/04 4402 1173
54   [일반/컴포넌트] 진법변환 (16->10, 10->2, 2->16. 10->8, 2->8)  김영대 2003/03/04 6227 1225
53   [일반/컴포넌트] 델파이 통합개발환경(IDE) 에 관한 몇가지 Tip  김영대 2003/03/04 5346 1431
52   [일반/컴포넌트] StringGrid 의 각 Cell의 정렬  김영대 2003/03/04 4606 1047

[이전 10개] [1]..[21][22] 23 [24][25]
 

Copyright 1999-2019 Zeroboard / skin by zero