< GDI 오브젝트 >

 

GDI 오브젝트(GDI Object)란 그래픽 출력에 사용되는 도구를 말하며 펜, 브러시, 비트맵, 폰트 등등 이 모두 GDI 오브젝트이다.

선을 그을 때는 펜으로 그리며 면은 브러쉬로 채우고 문자열을 출력할 때는 폰트를 사용하는 것이다.

이러한 GDI 오브젝트를 모아 놓은 것이 DC이며 GDI는 현재 DC에 선택되어 있는 GDI 오브젝트를 사용한다.

그래서 사용자는 그래픽을 그리기 전에 DC에 적절할 오브젝트를 선택함으로써 원하는 모양과 속성으로 그래픽을 출력할 수 있다.

GDI 오브젝트는 모두 핸들로 관리되므로 GDI 오브젝트를 생성하는 함수를 호출하고 이 함수가 리턴하는 핸들을 받아서 사용하기만 하면 된다.

 

< 펜 >

 

선을 그을 때 사용되는 GDI 오브젝트이다. 아래는 펜을 만들 때 사용되는 함수이다.

 

1
HPEN CreatePen(int iStyle, int cWidth, COLORREF color);
cs

 

iStyle 에는 그려질 선의 모양을 지정한다. 단, 선의 모양은 굵기가 1일 때만 효과가 있으며 굵기가 2 이상이면 무조건 실선으로 그려진다.

PS_SOLID / PS_DASH / PS_DOT / PS_DASHDOT / PS_DASHDOTDOT

 

cWidth 에는 선의 폭을 지정한다. 디폴트는 1이지만 변경 가능하며, 만약 값이 0이라면 무조건 1픽셀 두께의 선이 만들어진다.

 

color 에는 선의 색상을 지정한다. COLORREF 형이므로 RGB 매크로 함수를 사용하여 색상을 지정하면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HPEN MyPen, OldPen;
 
    switch(iMessage) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        MyPen = CreatePen(PS_SOLID, 5, RGB(0,0,255));
        OldPen = (HPEN)SelectObject(hdc, MyPen);
        Rectangle(hdc, 5050300200);
        SelectObject(hdc, OldPen);
        DeleteObject(MyPen);
        EndPaint(hWnd, &ps);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs

 

GDI 오브젝트도 메모리를 사용하기 때문에 더 이상 사용하지 않을 때에는 DeleteObject를 통해서 메모리를 해제해야 한다.

 

1
BOOL DeleteObject(HGDIOBJ ho);
cs

 

삭제하고자 하는 GDI 오브젝트의 핸들만 인수로 넘겨주면 된다. 주의할 사항은 DC에 현재 선택되어 있는 GDI 오브젝트는

삭제할 수 없다는 것이다. 이는 현재 사용되고 있는 객체를 함부로 삭제할수 없도록 만든 안정 규정때문이다.

그래서 삭제하기 전에 DC에 선택된 객체를 선택 해제해야 하므로 다음과 같은 방법을 사용한다.

 

우선 OldPen이라는 같은 종류의 GDI 오브젝트 핸들을 선언하고 이 OldPen 핸들에 MyPen이 선택되기 전의 펜 핸들을 저장해 둔다.

그리고 DC가 OldPen을 선택하게 하면 MyPen은 선택 해제가 되고 삭제할 수 있게 된다.

SelectObject의 리턴 값은 이전에 선택된 핸들값이므로 상기 코드와 같이 항상 OldPen을 이용하여 삭제하면 된다.

모든 GDI 오브젝트를 만들어 사요알 때는 위와 같은 방법을 사용한다.

 

< 브러시 >

 

채워지는 면을 채색하는 용도로 사용되는 GDI 오브젝트이다.

 

1
2
HBRUSH  CreateSolidBrush(COLORREF color);
HBRUSH  CreateHatchBrush(int iHatch, COLORREF color);
cs

 

브러시 생성 함수는 상기 두 가지가 있으며 CreateSolidBrush 함수는 색상만 인자로 받아 도형 내부를 선택한 색상으로 채운다.

CreateHatchBrush 함수는 색상과 무늬도 같이 지정할 수 있다.

지정할 수 있는 무늬는 HS_BDIAGONAL (좌하향 줄무늬) / HS_CROSS (바둑판 모양) / HS_DIAGCROSS (체크 무늬) /

HS_FDIAGONAL (우하향 줄무늬) / HS_HORIZONTAL (수평선) / HS_VERTICAL (수직선) 이 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HBRUSH MyBrush, OldBrush;
    HPEN MyPen, OldPen;
 
    switch(iMessage) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        MyPen = CreatePen(PS_SOLID, 5, RGB(0,0,255));
        MyBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,255));
        OldPen = (HPEN)SelectObject(hdc, MyPen);
        OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);
 
        Rectangle(hdc, 5050300200);
 
        SelectObject(hdc, OldPen);
        SelectObject(hdc, OldBrush);
        DeleteObject(MyPen);
        DeleteObject(MyBrush);
        EndPaint(hWnd, &ps);
        return 0;
    }
 
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs

 

< Old의 의미 >

 

GDI 오브젝트를 저장하는 리소스 영역은 메인 메모리와는 다른 특수한 영역인데 이 여역의 크기가 그리 크지 못해 오브젝트를

많이 만들면 금방 가득차 버린다. 그러므로 상기에서 설명했던 것과 같이 SelectObject 함수가 리턴하는 핸들을 Old 변수에 저장해

두었다가 다 사용한 후에는 DC에 Old 변수로 저장해두었던 핸들을 다시 집어넣고, Create한 객체를 삭제해주어야 한다.

+ Recent posts