728x90
반응형

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(수직선)

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기