CreatePen

원형 HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
MFC 원형 BOOL CPen::CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
BOOL CPen::CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );
인수

▶fnPenStyle:선의 모양을 결정한다. 다음 중 하나의 모양을 선택할 수 있다.

스타일 설명
PS_SOLID 실선
PS_DASH 길게 끊어진 점선. 굵기 1만 가능하다.
PS_DOT 점선. 굵기 1만 가능하다.
PS_DASHDOT 일점 쇄선. 굵기 1만 가능하다.
PS_DASHDOTDOT 이점 쇄선. 굵기 1만 가능하다.
PS_NULL 투명 선
PS_INSIDEFRAME 실선이되 사각형 안쪽으로만 그려진다.

▶nWidth:선의 굵기를 논리 단위로 지정한다. 0이면 1픽셀 굵기가 되다. PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT 스타일의 펜에는 굵기를 1이상으로 지정하면 이 펜은 PS_SOLID스타일로 변경된다.

▶crColor:선의 색상을 지정하며 RGB 매크로 함수를 사용한다.

리턴 만들어진 펜의 해들을 리턴하며 실패시 NULL을 리턴한다.
설명

펜은 GDI가 선을 그릴 때 사용하는 오브젝트이며 DC에 선택된 펜의 속성대로 선이 그어진다. 디폴트 펜은 굵기 1의 검정색 실선이나 펜을 만들어 DC로 전송하면 만들어진 펜대로 선이 그어진다. 다 사용하고 난 후에는 DeleteObject 함수로 펜을 삭제해야 한다.

예제 1

다음 예제는 각각의 스타일로 4개의 펜을 만들어 선을 긋는다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HPEN MyPen[5], OldPen;
	int i;

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		MyPen[0]=CreatePen(PS_SOLID, 5, RGB(0,0,255));
		MyPen[1]=CreatePen(PS_SOLID, 3, RGB(0,255,0));
		MyPen[2]=CreatePen(PS_DOT, 1, RGB(255,0,0));
		MyPen[3]=CreatePen(PS_DASHDOT, 1, RGB(0,0,0));
		MyPen[4]=CreatePen(PS_DASH, 1, RGB(0,0,0));
		for (i=0;i<5;i++) {
			OldPen=(HPEN)SelectObject(hdc, MyPen[i]);
			MoveToEx(hdc,10,i*20+10,NULL);
			LineTo(hdc,200,i*20+10);
			SelectObject(hdc, OldPen);
			DeleteObject(MyPen[i]);
		}
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

출력 결과는 다음과 같다. 다양한 스타일과 색상으로 선이 그려진다.

예제 2

다음 예제는 PS_SOLID 스타일과 PS_INSIDEFRAME 스타일의 차이점을 보인 것이다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HPEN hSolidPen, hInsidePen, OldPen;

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		hSolidPen=CreatePen(PS_SOLID, 8, RGB(0,0,255));
		hInsidePen=CreatePen(PS_INSIDEFRAME, 8, RGB(0,0,255));
		OldPen=(HPEN)SelectObject(hdc, hSolidPen);
		Rectangle(hdc,10,10,100,100);

		SelectObject(hdc,hInsidePen);
		Rectangle(hdc,110,10,200,100);

		SelectObject(hdc, OldPen);
		DeleteObject(hSolidPen);
		DeleteObject(hInsidePen);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

각각 굵기 8의 펜으로 넓이와 폭이 90픽셀인 사각형을 그렸다. hSolidPen으로 그린 사각형은 8픽셀 두께의 선이 사각형의 양쪽으로 확장되며 그려지므로 그려진 사각형의 넓이와 폭이 94픽셀이 되지만 hInsidePen으로 그린 사각형은 펜의 두께가 사각형 안쪽으로만 확장되어 그려진 사각형의 높이와 넓이가 90픽셀이 된다.

참고함수 CreatePenIndirect:LOGPEN 구조체로 선은 작성한다.
플렛폼 95이상
참조  

written by http://www.winapi.co.kr