본문 바로가기
API Programming

[API] GDI Object(Graphic Device interface) 란?

by cod1ng 2024. 3. 9.

GDI(Graphic Device interface)

GDI는 화면, 프린터 등 모든 출력 장치를 제어하는 윈도우의 핵심 모듈 중 하나이다.

윈도우 프로그램에서의 모든 출력은 GDI를 통해서 화면과 프린터로 나가게 되어 있다.

 

GDI Object란 그래픽 출력에 사용되는 도구들을 말하며 펜,브러쉬,비트맵,폰트 등 

이 것을 모두 GDI 오브젝트라고 한다.

 

GDI 오브젝트는 구조체이지만 핸들로 관리되므로 

GDI 오브젝트를 생성하는 함수를 부르고 이 함수가 리턴하는 핸들을 받아서 사용하면 된다.

 

디폴트 값

GDI 오브젝트 핸들 타입 설명 디폴트
HPEN 선을 그릴 때 사용 검정색의 가는 실선
브러쉬 HBRUSH 면을 채울 때 사용 흰색
폰트 HFONT 문자 출력에 사용 시스템 글꼴
비트맵 HBITMAP 비트맵 이미지 선택되지 않음
팔레트 HPALETTE 팔레트 선택되지 않음
리전 HRGN 화면상의 영역 선택되지 않음

 

 

오브젝트를 생성하는 방법은 2가지가 있다.

시스템이 생성한 오브젝트 생성

-GetStockObject

내가 원하는 형태의 오브젝트 생성

-CreateXXX

스톡 오브젝트(Stock Object)

스톡 오브젝트란 윈도우가 미리 제공하는 GDI 오브젝트를 말한다, 일종의 라이브러리 함수와 같은 개념으로 보면된다

사용방법은 아래와 같다

HGDIOBJ GetStockObject(int fnObject);
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
 case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HBRUSH brush = (HBRUSH)GetStockObject(GRAY_BRUSH);
HBRUSH old = (HBRUSH)SelectObject(hdc, brush);
Rectangle(hdc, 10,10,100,100);
SelectObject(hdc, old);
EndPaint(hwnd, &ps);
}
 return 0;
case WM_DESTROY:
64
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
오브젝트 설명 오브젝트 설명
BLACK_BRUSH 검정색 브러쉬 GRAY_BRUSH 회색 브러쉬
NULL_BRUSH 투명 브러쉬 WHITE_BRUSH 흰색 브러쉬
DKGRAY_BRUSH 짙은 회색 브러쉬 LTGRAY_BRUSH 옅은 회색 브러쉬
DC_BRUSH 색상 브러쉬    
BLACK_PEN 검정색 펜 WHITE_PEN 흰색 펜
NULL_PEN 투명 펜 DC_PEN 색상 펜
ANSI_FIXED_FONT 고정폭 폰트 ANSI_VAR_FONT 가변폭 폰트
DEFAULT_PALETTE 시스템 팔레트    

 

색상

윈도우에서는 색상값을 표현하기 위해 COLORREF 라는 데이터형을 사용한다.

typedef DWORD COLORREF;

RGB 메크로 함수를 사용하는데 세 가지 인수로 조절한다

예) RGB(0,0,0) 검정색  RGB(255,255,255) 흰색 RGB(255,0,0) 빨간색 등

 

펜은 선을 그을 때 사용되는 GDI 오브젝트이다.

HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);

첫 번째 인자는 선의 모양, 두 번째 인자는 선의 폭,세 번째 인자는 선의 색상을 지정한다.

 

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
 case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HPEN pen = CreatePen(PS_SOLID, 5, RGB(255,0, 0));
HPEN old = (HPEN)SelectObject(hdc, pen);
Rectangle(hdc, 10,10,100,100);
DeleteObject(SelectObject(hdc, old));
EndPaint(hwnd, &ps);
}
 return 0;
;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

 67
return DefWindowProc(hwnd, msg, wParam, lParam);
}

빨간색외곽선의 사각형을 10,10 좌표에 100x100 크기로 생성하는 코드이다.

 

브러쉬

브러쉬는 면을 채색하는 용도로 사용된다.

HBRUSH CreateSolidBrush(COLORREF crColor);
 HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);

첫 번째 함수는 단색 브러쉬 이고

두 번째 함수는 색상 뿐 아니라 무늬를 지정할 수 있다.

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
 case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HBRUSH brush = CreateHatchBrush(HS_CROSS, RGB(255,0, 0));
HBRUSH old = (HBRUSH)SelectObject(hdc, brush);
Rectangle(hdc, 10,10,100,100);
DeleteObject(SelectObject(hdc, old));
EndPaint(hwnd, &ps);
}
 return 0;
case WM_DESTROY:
PostQuitMessage(0);

 69
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}