2011년9월8일_winAPI_윈도우즈에서 색상의 표현, RGB매크로함수, 칼라테두리만들기, DC(Device Context)와 GDI오브젝트와 핸들에 대한 개념도 상상





● 색상값을 표현하기 위한 데이터형

typedef DWORD COLORREF;

DWORD라는 자료형으로 새로운 COLORREF라는 자료형이 정의.


image imageimage

VS6.0에서 window.h를 인클루드한 소스파일에서 COLORREF를 친 다음 오른 클릭하여,
Go To Definition Of COLORREF를 선택하면 COLORREF는 DWORD라는 type이고,
DWORD는 unsigned long으로 32비트 컴퓨터 시스템(+CL컴파일러)에서는 32bit의 크기를 갖는다.


image 






● RGB 매크로 함수

#define RGB(r,g,b)     ((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))


RGB라는 매크로 함수는 상기와 같이 정의되어 있으며,
다소 복잡해 보이지만 아래와 같이 하나씩 끊어서 보면 그리 어렵지 않다.

image

OR연산을 하면 0으로 채워진 비트는 무시된 채로 세 가지의 색상에 해당하는 값들이 합쳐진다.
마지막에 COLORREF자료형으로 캐스팅하면 완성~






● 색깔이 있는 테두리를 그리는 펜 오브젝트를 새로 생성하기

윈도우즈가 제공하는 스톡오브젝트의 펜은 무채색밖에 표현할 수 없으므로 칼라풀한 테두리를 그릴려면,
직접 만들어서 사용해야 한다.

image

뭐 설명 안 해도 잘 알겠죠?
그만 다 때려치우고 중요한 DC와 오브젝트와 핸들에 대한 개념부터 알아봅시다.




● DC(Device Context)와 GDI오브젝트와 핸들에 대한 개념도 상상

image

DC는 GDI오브젝트를 모아 놓은 것으로 GDI리소스들의 엄마가 아닌가 생각된다.
그리고 그 DC를 가리키는 것이 DC핸들이고,
HDC hdc; 로 선언해서 사용해 왔었다.
DC안에 있는 오브젝트들은 스톡오브젝트들이고,
노란색 동그라미 안에 있는 오브젝트는 프로그래머가 만든 오브젝트이다.
나는 펜이라는 스톡오브젝트가 칼라펜이라는 사용자오브젝트의 부모클래스격이고,
상속받아 칼라펜이 만들어 지는게 아닌가 한다.
(우리가 하는 소스코드는 C언어라 클래스개념이 없으나 윈도우즈 운영체제는 그런 개념이 있을 듯 하다.)

그렇게 만들어진 칼라펜 오브젝트는 실행 중인 프로세스 heap영역에 위치하고 사용하다가 버려지는게 아닌가 한다.
처음에는 DC안에 GDI오브젝트가 있다고 하여 나는 왜 DC핸들 안에 오브젝트가 있나 했다.
그런데 자세히 보니 DC핸들이 아니고 DC더라…잘 못 봤다.
그래서 DC핸들 안에 오브젝트가 아닌 DC핸들이 가리키는 곳의 메모리 영역에 있는 GDI오브젝트인 줄 알고 엉뚱한 결론을 내려다가..
그만둠.. ㅠㅠ





● 임시 첨부

   1: LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
   2: {
   3:     HDC hdc;
   4:     PAINTSTRUCT ps;
   5:     HPEN MyPen, OldPen;
   6:     HBRUSH MyBrush, OldBrush;
   7:     COLORREF
   8:  
   9:     hdc = BeginPaint(hWnd, &ps);
  10:  
  11:     MyPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 255));        //펜오브젝트 만듬.
  12:     OldPen = (HPEN)SelectObject(hdc, MyPen);            //예전 오브젝트핸들 백업과 새로운 오브젝트핸들 적용?
  13:     MyBrush = CreateHatchBrush(HS_BDIAGONAL, RGB(0, 100, 255));        //펜오브젝트 만듬.
  14:     OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);            //예전 오브젝트핸들 백업과 새로운 오브젝트핸들 적용?
  15:  
  16:     Rectangle(hdc, 50, 50, 300, 200);
  17:  
  18:     SelectObject(hdc, OldPen);
  19:     DeleteObject(MyPen);
  20:     DeleteObject(SelectObject(hdc, OldBrush));
  21:  
  22:     MyPen = CreatePen(PS_DASH, 1, RGB(255, 0, 0));
  23:     OldPen = (HPEN)SelectObject(hdc, MyPen);
  24:     MyBrush = CreateHatchBrush(HS_CROSS, RGB(255, 100, 100));        //펜오브젝트 만듬.
  25:     OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);            //예전 오브젝트핸들 백업과 새로운 오브젝트핸들 적용?
  26:  
  27:     Rectangle(hdc, 150, 150, 400, 300);
  28:  
  29:     SelectObject(hdc, OldPen);
  30:     DeleteObject(MyPen);
  31:     DeleteObject(SelectObject(hdc, OldBrush));
  32:  
  33:     MyPen = CreatePen(PS_DOT, 1, RGB(0, 255, 0));
  34:     OldPen = (HPEN)SelectObject(hdc, MyPen);
  35:     MyBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(100, 255, 100));        //펜오브젝트 만듬.
  36:     OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);            //예전 오브젝트핸들 백업과 새로운 오브젝트핸들 적용?
  37:  
  38:     Rectangle(hdc, 250, 250, 500, 400);
  39:  
  40:     SelectObject(hdc, OldPen);
  41:     DeleteObject(MyPen);
  42:     DeleteObject(SelectObject(hdc, OldBrush));
  43:  
  44:  
  45:     EndPaint(hWnd, &ps);
  46:  
  47:     return 0;
  48: }



image

오늘 하루 뭐 한거지?