GDI object
GDI는 화면, 프린터 등의 모든 출력 장치를 제어하는 핵심 모듈 중 하나입니다. 윈도우 프로그램에서의 모든 출력은 GDI를 통해서 화면과 프린터로 나가게 되어있습니다.
GDI 오브젝트란 그래픽 출력에 사용되는 도구들을 말하며 펜, 브러쉬, 비트맵 , 폰트 등을 GDI 오브젝트라고 말합니다.
GDI 오브젝트는 일종의 구조체이지만 핸들로 관리되므로 우리는 GDI 오브젝트를 생성하는 함수를 부르고 이 함수가 리턴하는 핸들을 받아서 사용하기만 하면 됩니다.
DC가 처음 만들어 질 때 GDI 오브젝트별 선택되는 디폴트 값은 아래와 같습니다.
GDI 오브젝트 | 핸들 타입 | 설명 | 디폴트 |
펜 | HPEN | 선을 그릴 때 사용 | 검정색의 가는 실선 |
브러쉬 | HBRUSH | 면을 채울 때 사용 | 흰색 |
폰트 | HFONT | 문자 출력에 사용 | 시스템 글꼴 |
비트맵 | HBITMAP | 비트맵 이미지 | 선택되지 않음 |
팔레트 | HPALETTE | 팔레트 | 선택되지 않음 |
리전 | HRGN | 화면상의 영역 | 선택되지 않음 |
스톡 오브젝트
스톡 오브젝트(Stock Object)는 윈도우가 미리 제공하는 GDI 오브젝트를 말합니다. 만들지 않아도 언제나 사용할 수 있고 사용 후 파괴할 필요가 없습니다. 다음 함수로 핸들을 얻어서 사용합니다.
HGDIOBJ GetStockObject(int fnObject);
사용 가능한 스톡 오브젝트는 다음과 같습니다. 주로 브러쉬와 펜이 스톡 오브젝트로 활용됩니다.
오브젝트 | 설명 | 오브젝트 | 설명 |
BLACK_BRUSH | 검정색 브러쉬 | GRAY_BRUSH | 회색 브러쉬 |
NULL_BRUSH | 투명 브러쉬 | WHITE_BRUSH | 흰색 브러쉬 |
DKGRAY_BRUSH | 짙은 회색 브러쉬 | LTGRAY_BRUSH | 옅은 회색 브러쉬 |
DC_BRUSH | 색상 브러쉬 | ||
BLACK_PEN | 검정색 펜 | WHITE_PAN | 흰색 펜 |
NULL_PEN | 투명 펜 | DC_PEN | 색상 펜 |
ANSI_FIXED_FONT | 고정폭 폰트 | ANSI_VAR_FONT | 가변폭 폰트 |
DEFAULT_PALETTE | 시스템 팔레트 |
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:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
위의 예제는 회색의 사각형을 출력하는 예제이다. 위 코드를 통해 GDI 오브젝트 사용법을 살펴보면
1. 오브젝트를 생성한다.
오브젝트를 생성하는 방법은 2가지가 있다.
- 시스템이 생성한 오브젝트를 가져오는 GetStockObject
- 내가 원하는 형태의 오브젝트를 생성하는 : CreateXXX
2. 생성된 오브젝트를 선택한다.
- GetStockObject 함수가 그 역할을 한다.
- 선택하고자 하는 오브젝트를 인자로 전달하면 원래 가지고 있었던 오브젝트를 리턴해준다.
3. 그래픽 함수로 원하는 도형을 출력한다.
4. 다시 원래의 오브젝트를 선택한다.
- 2번 과정에서 리턴된 오브젝트로 다시 복원한다.
5. 생성한 오브젝트를 소멸한다.
- 만약 1번에서 생성한 오브젝트가 시스템 오브젝트라면 소멸할 필요가 없다.
- 내가 원하는 형태의 오브젝트 일경우에만 DeleteObject() 함수로 소멸하면 된다.
색상
윈도우에서는 색상값을 표현하기 위해 COLORREF 라는 데이터형을 사용합니다.
typedef DWORD COLORREF;
해당 데이터 타입에 색상을 저장하기 위해서는 RGB 매크로 함수를 사용하는데 이는 세가지 인수를 가집니다. 이 3가지 인수로 색상을 조합합니다.
RGB값 | 색상 | RGB값 | 색상 |
RGB(0,0,0) | 검정색 | RGB(255,255,255) | 흰색 |
RGB(128,128,128) | 회색 | RGB(255,0,0) | 빨간색 |
RGB(0,255,0) | 초록색 | RGB(0,0,255) | 파란색 |
RGB(255,255,0) | 노란색 | RGB(255,0,255) | 분홍색 |
모든 인수는 0 ~ 255의 값을 갖습니다.
아래의 매크로 함수는 COLORREF 형 변수에서 각 색상의 농도를 분리합니다.
#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb))>>8))
#define GetBValue(rgb) ((BYTE)((rgb)>>16))
펜
펜은 선을 그을 때 사용되는 GDI 오브젝트입니다. 펜을 만들 때는 다음 함수를 사용합니다.
HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
첫 번째 인수는 선의 모양을 지정합니다. 아래의 그림의 Pen Style을 참고하세요.
두 번째 인수는 선의 폭을 지정합니다. 디폴트 선의 굵기는 1입니다.
세 번째 인수는 선의 색상을 지정합니다.
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;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
화면에 빨간색 Pen 테두리를 출력하는 예제이다.
브러쉬
브러쉬는 채워지는 면을 채색하는 용도로 사용되는데 말 그대로 붓을 의미합니다.
HBRUSH CreateSolidBrush(COLORREF crColor);
HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);
위의 함수로 브러쉬를 생성할 수 있습니다.
첫 번째 함수는 단색 브러쉬만을 만들 수 있으며 색상만 인자로 전달하면 됩니다.
두 번째 함수는 색상 뿐 아니라 무늬를 지정할 수 있습니다.
HS_FDIAGONAL(우하향 줄무늬) | HS_BDIAGONAL(좌하향 줄무늬) |
HS_CROSS(바둑판 모양) | HS_HORIZONTAL(수평선) |
HS_DIAGCROSS(좌우하향 줄무늬) | HS_VERTICAL(수직선) |
최근댓글