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);
}'API Programming' 카테고리의 다른 글
| [API] 문자열 출력 TextOut() & DrawText() (0) | 2024.03.07 |
|---|---|
| [API] DC(Device Context) 란? (0) | 2024.03.06 |
| [API] 메시지 프로시저 호출하기 SendMessage & PostMessage (1) | 2024.03.06 |
| [API] 메시지 큐에서 메시지 가져오기 (0) | 2024.03.06 |
| [API] 스켈레톤 기본 코드를 이용해서 기능 구현하기 (1) | 2024.03.06 |