윈도우즈가 제공하는 펜은 흰색, 검정색, 투명색 세 가지 뿐이며, 파란색, 노란색 등의 원색 펜은 없다.
그러므로 다양한 색의 펜을 사용하고 싶다면 직접 만들어서 사용하는 방법밖에 없다.
펜을 만들 때는 다음 함수를 사용한다.
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 |