Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
화면모드를 알아내는 방법
안녕하세요.
현재 화면 모드를 알아 내는 방법이 어떻게 되나요.
1
COMMENTS
김영대
•
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.
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
djha
•
1999.05.17 22:17
2
COMMENTS
/
0
LIKES
텍스트에디터에 라인넘버 or 마크?
황준동
•
1999.05.18 01:47
djha wrote: > > 안녕하십니까? 입문한지 얼마 안된 초보입니다. > > 텍스트 에디터를 만들고자 하는...
djha
•
1999.05.18 02:44
초보라서 질문이 엉성했습니다.다시 질문을 드리겠습니다. 텍스트에디트를 만들고자합니다. 그런데 이...
왕초보
1999.05.17 22:16
0
COMMENTS
/
0
LIKES
컴포넌트 깜빡임 제거방법??
이호선
•
•
1999.05.17 20:38
1
COMMENTS
/
1
LIKES
화면모드를 알아내는 방법
안녕하세요. 현재 화면 모드를 알아 내는 방법이 어떻게 되나요.
김영대
•
1999.05.17 20:54
이호선 wrote: > 안녕하세요. > 현재 화면 모드를 알아 내는 방법이 어떻게 되나요. 안녕하세요 김영...
saint09
•
1999.05.17 20:11
1
COMMENTS
/
0
LIKES
paradox에서의 변수 타입?
황준동
•
1999.05.18 01:56
saint09 wrote: > 안녕하세요 델파이로 db를 작성하려고 하는데 기본적으로 파라독스로 되어 있더군요. 예...
북해
•
1999.05.17 18:55
1
COMMENTS
/
0
LIKES
(왕초보) 메모장에서 문자입력시에..
이정욱
•
1999.05.17 19:44
TMemo의 ImeMode를 imSHanguel 로 줘보세요. ^^ 델4에서는 간단하죠? 북해 wrote: > 안녕하세요. 저는...
북해
•
1999.05.17 18:53
1
COMMENTS
/
0
LIKES
(왕초보)FieldbyName을 사용하려하는데..
이정욱
•
1999.05.17 19:41
델파이의 자동코드완성기는 그 문법에 맞게 출력이 됩니다. 즉, Edit1.Text := Query1. 까지 쳤을때는 Fie...
초심자
•
1999.05.17 18:40
1
COMMENTS
/
0
LIKES
윈98에서의 델파이
redhead
•
1999.05.18 19:16
RAM을 얼마나 쓰시는지? 윈98에서 리소스가 부족하면 그런 현상이 나타나는 것 같던데요.
북해
•
1999.05.17 18:39
2
COMMENTS
/
0
LIKES
(왕초보)서브 폼이 닫힐때...
하윤철
•
1999.05.18 01:14
북해 wrote: > 안녕하세요. 저는 간단한 메모장 프로그램을 만들려고 하는데요, 메인폼에서는 검색을 하고...
이정욱
•
1999.05.17 19:37
Edit을 클릭해도 그 이벤트가 발생하나요? Memo도요? 이상하군요.. Edit에서 Enter를 시면 그 이벤트가 ...
한상훈
•
1999.05.17 12:21
1
COMMENTS
/
0
LIKES
edit필드에 여러값 차례로 보기
이정욱
•
1999.05.17 19:21
Query로 하셨으면 그 Query는 이미 그 조건에 해당하는 데이타만 긁어서 가지고 있습니다. 다음데이타를 ...
이대선
•
1999.05.17 05:18
2
COMMENTS
/
0
LIKES
'CBAA'를 'AABC'로 sort하는 법좀....
황준동
•
1999.05.18 01:45
이대선 wrote: > 'CBAA'를 'AABC'로 쇼트 시키는 법을 알고 싶습니다. > > 꼭 좀 답변해 주세요.. > ...
김영대
•
1999.05.17 17:50
이대선 wrote: > 'CBAA'를 'AABC'로 쇼트 시키는 법을 알고 싶습니다. > > 꼭 좀 답변해 주세요.. > ...
saint09
1999.05.16 22:11
0
COMMENTS
/
0
LIKES
이정욱님 감사드립니다.
saint09
•
1999.05.16 09:37
1
COMMENTS
/
0
LIKES
DrawFocusRect 사용법 정말 모르겠네요
이정욱
•
1999.05.16 11:16
DrawFocusRect는 이렇게 사용하세요. 예를들어 Rect(100,100,200,200)을 Panel에 그린다면... var Rct...
saint09
•
1999.05.16 03:10
1
COMMENTS
/
0
LIKES
델파이에서 페인트 브러쉬의 잘라내기 모양 흉내내기
이정욱
•
1999.05.16 04:48
DrawFocusRect를 이용하시면 됩니다. DrawFocusRect를 이용해서 그린 후 다시 그자리에 DrawFocusRect를 ...
정방현
•
1999.05.16 01:59
4
COMMENTS
/
0
LIKES
동적 sql 사용시
이천주
•
1999.05.17 22:23
저는 이렇게 했읍니다. 두개짜리 따옴표가 아니고 한개짜리를 써야합니다. ss := ' update X...
신호성
•
1999.05.16 06:01
정방현 wrote: > 'cpu'라는 인자를 대입해서 오라클 테이블에 update하고자 합니다. > 실행 error는 Edat...
정방현
•
1999.05.16 20:01
신호성 wrote: > 정방현 wrote: > > 'cpu'라는 인자를 대입해서 오라클 테이블에 update하고자 합니다. ...
김경수
•
1999.05.17 00:26
안녕하세요. parambyname('cpu').asstring~~` 대신에 params[0].asstring 으로 바꾸어서 해보세요.왜그런...
saint09
•
1999.05.16 01:56
1
COMMENTS
/
0
LIKES
델파이에서 event 관련 문제
류
•
1999.05.16 02:04
saint09 wrote: > 안녕하세요. 델파이에 보면 각 컴포넌트별로 이벤트가 있습니다. 이 이벤트들을 보면 마...
델파이언
•
1999.05.16 01:32
1
COMMENTS
/
0
LIKES
스트링그리드에서 스크롤바 사용시...
이정욱
•
1999.05.17 05:15
스크롤바를 움직일 때 발생하는 메세지입니다. WM_SYSCOMMAND 의 wParam의 값이 SC_HSCROLL 이면 수평스크...
문창완
1999.05.15 22:25
0
COMMENTS
/
0
LIKES
이미지 꼭지를 라운드처리...꼭 부탁
강지영
•
1999.05.15 21:36
1
COMMENTS
/
0
LIKES
Message를 받는 부분입니다.
류
•
1999.05.15 23:02
제가 델파이로 api를 공부하다가.. wm_char 을 받는 부분을 사용한게 있네요.. 도움이 될지는 모르겠지...
허엽
1999.05.15 20:57
0
COMMENTS
/
0
LIKES
익스플로어의 크기에 따른 ActiveX의 크기변화?
안 류진
1999.05.15 20:16
0
COMMENTS
/
0
LIKES
FTP 프로그램에 대한 모든것을 도와주세요
이호선
1999/05/17 20:38
Views
231
Likes
1
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> 안녕하세요.
> 현재 화면 모드를 알아 내는 방법이 어떻게 되나요.
안녕하세요 김영대입니다
아래 소스는 화면 모드를 읽고 변경하는 예제입니다
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.