본문 바로가기

API

나만의 펜을 만들어 보자!

윈도우즈가 제공하는 펜은 흰색, 검정색, 투명색 세 가지 뿐이며, 파란색, 노란색 등의 원색 펜은 없다.


그러므로 다양한 색의 펜을 사용하고 싶다면 직접 만들어서 사용하는 방법밖에 없다.


펜을 만들 때는 다음 함수를 사용한다.


HPEN CreatePen(int fnStyle, int nWidth, COLORREF crColor);


세 개의 인수를 가지며 각 인수의 의미는 다음과 같다.


fnStyle


그려질 선의 모양을 지정한다. 이 값을 변경하면 다양한 형태의 선을 만들 수 있다.



PS_SOLID는 실선, PS_DASH는 긴 점선, PS_DOT은 점선, PS_DASHDOT은 일점 쇄선, PS_DASHDOTDOT은 이점 쇄선이다.

하지만 선의 굵기가 2 이상이면 무조건 실선으로 그려짐으로, 위의 모양을 사용하고 싶다면 선의 굵기가 1이어야만 한다.

nWidth


선의 폭을 지정한다. 선의 굵기는 1이지만, 이 값을 2나 3으로 변경하면 두꺼운 선을 그릴 수 있다.

단 이 값이 0일 경우는 무조건 1픽셀 두께의 선이 만들어진다.


crColor


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



CreatePen 함수는 새로 만든 펜의 핸들이 리턴되는데 이 값을 잘 보관해 두어야 만들어진 펜을 사용할 수 있으며 다 사용한 후 파괴할 수도 있다.



코드 -------------

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
   HDC hdc;
   PAINTSTRUCT ps;
   HPEN NowPen, OldPen;
   
   switch(iMessage){
   case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);
      NowPen = CreatePen(PS_SOLID, 2, RGB(0,0,255));
      OldPen = (HPEN)SelectObject(hdc, NowPen);
      Rectangle(hdc, 50, 50, 300, 300);
      SelectObject(hdc, OldPen);
      DeleteObject(NowPen);
      EndPaint(hWnd, &ps);
      return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   }
   return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}


실행결과 -------------

CreatePen 함수를 호출하여 굵기 2의 파란색 실선 펜을 만든 후 이 펜의 핸들을 NowPen에 대입하였다. 그리고 SelectObject로 이 펜을 DC에 선택한 후 사각형을 그렸으므로 사각형의 테두리는 굵은 파란색으로 그려질 것이다.


13번째 구문을 보자. 대충 어떤 기능을 하는 함수인지 짐작이 갈 텐데, GDI 오브젝트는 사용한 후 반드시 삭제해야 한다.

왜냐하면


GDI 오브젝트도 메모리를 사용하기 때문이다. 메모리를 할당한 후 해제해야 하는 것과 마찬가지로 GDI 오브젝트도 사용이 끝나면 해제하는 것이 원칙이다. 만약 해제하지 않는다면.... 이후 어떤 일이 일어날지는 모두 알 것이라 믿겠다.


그러면 DeleteObject 함수의 사용법을 알아보자.


BOOL DeleteObject( HGDIOBJ hObject);


삭제하고자 하는 GDI 오브젝트의 핸들만 인수로 넘겨주면 된다. 단, 이때 주의할 것은 DC에 현재 선택되어 있는 GDI 오브젝트는 삭제할 수 없다는 점인데 이는 현재 사용되고 있는 객체를 함부로 삭제하도록 내버려 둘 수는 없기 때문에 생긴 안정 규정이다. 그래서 삭제하기 전에 DC에 선택된 객체를 선택 해제해야 하는데 가장 간단한 방법은 같은 종류의 다른 GDI 오브젝트를 선택하는 것이다.

그래서 OldPen 핸들을 하나 더 선언하고, NowPen이 선택되기 전의 펜 핸들을 OldPen 핸들에 대입하고, NowPen을 삭제하기 전에 SelectObject 함수를 사용해 OldPen을 다시 선택하는 것이다.


'API' 카테고리의 다른 글

Old의 의미  (0) 2018.01.22
브러쉬 만들기  (0) 2018.01.22
StockObject를사용한 GDI브러쉬 색 변경  (0) 2018.01.14
GDI?  (0) 2018.01.14
LoadString  (0) 2018.01.14