[WinAPI] HDC 2 – HPEN, HBRUSH 사용하기

[WinAPI] HDC 2 – HPEN, HBRUSH 사용하기

이전 글을 안보신 분들은 꼭 봐주세요.

오늘은 저번 글에 이어서, HPENHBRUSH를 이용하여 도형의 선의 색, 굵기, 배경색을 변경해보도록 하겠습니다.
도형의 선과 굵기, 색상을 변경하기 위해선 HEPN을 사용해야 합니다.

빨간색의 굵기가 3인 펜을 생성하기 위해 아래와 같이 HPEN을 생성 합니다.

HPEN hpen;
hpen = CreatePen( PS_SOLID, 3, RGB(255, 0, 0) );	// 선 스타일, 굵기, 색상

이 펜을 DC에 사용하기 위해 아래와 같이 선택합니다.

HPEN hpenOld;
hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택

펜을 다 사용했으면 기존의 HPEN을 선택 후 지워줍니다.

hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존의 펜 선택
::DeleteObject( hpen );	// 생성한 펜 삭제

위의 과정을 사각형 그리는 부분에 적용한 코드는 아래와 같습니다.

HPEN hpen;
HPEN hpenOld;

// todo .. : 사각형 그리기
hpen = CreatePen( PS_SOLID, 3, RGB(255, 0, 0) );	// 선 스타일, 굵기, 색상
hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
::Rectangle( hdc, 10, 10, 100, 100 );	// 사각형 그리기
hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존의 펜 다시 선택
::DeleteObject( hpen );	// 생성한 펜 삭제

이 상태로 실행시키면 아래와 같이 사각형이 빨간색(RGB(255,0,0)) 굵기 3으로 그려집니다.

CreatePen구문에서 첫번째 인자 PS_SOLID대신 아래의 인자들을 사용해 보세요. (펜의 굵기가 1일때만 적용됩니다.)

#define PS_SOLID            0
#define PS_DASH             1       /* -------  */
#define PS_DOT              2       /* .......  */
#define PS_DASHDOT          3       /* _._._._  */
#define PS_DASHDOTDOT       4       /* _.._.._  */

이제 빨간색 사각형에 브러쉬로 내부를 색칠해보겠습니다.
아래와 같이 초록 색상의 브러쉬를 생성합니다.

HBRUSH hbr;
hbr = CreateSolidBrush( RGB(0, 255, 0) );	// 브러쉬 색

브러쉬를 사용하기위해 dc에 선택합니다.

HBRUSH hbrOld;
hbrOld = (HBRUSH)::SelectObject( hdc, hbr );	// 브러쉬 선택

브러쉬를 다 사용했으면 기존의 브로쉬를 선택한 후 삭제합니다.

hbr = (HBRUSH)::SelectObject( hdc, hbrOld );	// 기존 브러쉬 선택
::DeleteObject( hbr );	// 생성한 브러쉬 삭제

위의 과정을 사각형에 적용하면 아래와 같습니다.

HPEN hpen;
HPEN hpenOld;
HBRUSH hbr;
HBRUSH hbrOld;

// todo .. : 사각형 그리기
hbr = CreateSolidBrush( RGB(0, 255, 0) );	// 브러쉬 색
hbrOld = (HBRUSH)::SelectObject( hdc, hbr );	// 브러쉬 선택
hpen = CreatePen( PS_SOLID, 3, RGB(255, 0, 0) );	// 선 스타일, 굵기, 색상
hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
::Rectangle( hdc, 10, 10, 100, 100 );	// 사각형 그리기
hbr = (HBRUSH)::SelectObject( hdc, hbrOld );	// 기존 브러쉬 선택
::DeleteObject( hbr );	// 생성한 브러쉬 삭제
hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존 펜 선택
::DeleteObject( hpen );	// 생성한 펜 삭제

이 상태로 실행시키면 아래와 같이 그려집니다.

만약 색을 채우는게 아닌 선으로 그려넣고 싶으시면 아래와 같이 CreateHatchBrush으로 생성하시면 됩니다.

hbr = CreateHatchBrush( HS_DIAGCROSS, RGB( 255, 0, 0 ) );	// 선 스타일, 선 색

HS_DIAGCROSS 말고 아래와 같이 다른 인자를 사용해 보세요.

#define HS_HORIZONTAL       0       /* ----- */ 
#define HS_VERTICAL         1       /* ||||| */ 
#define HS_FDIAGONAL        2       /* \\\\\ */ 
#define HS_BDIAGONAL        3       /* ///// */ 
#define HS_CROSS            4       /* +++++ */ 
#define HS_DIAGCROSS        5       /* xxxxx */

만약 색을 채우지 않고 투명하게 만들고 싶으시면 아래와 같이 GetStockObject를 사용하시면 됩니다.

hbr = (HBRUSH)::GetStockObject( NULL_BRUSH );	// 투명 브러쉬

도형 전체 적용시킨 코드입니다.

void CMFCApplication1Dlg::OnBnClickedOk()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	HWND hwnd = ::GetDlgItem( this->GetSafeHwnd(), IDC_STATIC_VIEW );	// 그림 그릴 윈도우 핸들을 구해서
	CRect rect;
	::GetWindowRect( hwnd, rect );	// 그림 그릴 윈도우 크기 구하기

	HDC hdc = ::GetDC( hwnd );	// 그림 그릴 윈도우의 HDC 구하기
	HBITMAP hbmp = ::CreateCompatibleBitmap( hdc, rect.Width(), rect.Height() );	// 그림 그릴 윈도우의 HBITMAP 구하기
	HBITMAP hbmpOld = (HBITMAP)::SelectObject( hdc, hbmp );	// 그림 그릴 윈도우의 HBITMAP 선택하기

	HPEN hpen;
	HPEN hpenOld;
	HBRUSH hbr;
	HBRUSH hbrOld;

	// todo .. : 사각형 그리기
	hbr = CreateSolidBrush( RGB( 0, 255, 0 ) );	// 브러쉬 색
	hpen = CreatePen( PS_SOLID, 3, RGB( 255, 0, 0 ) );	// 선 스타일, 굵기, 색상
	hbrOld = (HBRUSH)::SelectObject( hdc, hbr );	// 브러쉬 선택
	hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
	::Rectangle( hdc, 10, 10, 100, 100 );	// 사각형 그리기
	hbr = (HBRUSH)::SelectObject( hdc, hbrOld );	// 기존 브러쉬 선택
	hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존 펜 선택
	::DeleteObject( hbr );	// 생성한 브러쉬 삭제
	::DeleteObject( hpen );	// 생성한 펜 삭제

	// todo .. : 원 그리기
	hbr = CreateHatchBrush( HS_DIAGCROSS, RGB( 255, 0, 0 ) );	// 선 스타일, 선 색
	hpen = CreatePen( PS_DASH, 1, RGB( 0, 0, 255 ) );	// 선 스타일, 굵기, 색상
	hbrOld = (HBRUSH)::SelectObject( hdc, hbr );	// 브러쉬 선택
	hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
	::Ellipse( hdc, 110, 10, 200, 100 );
	hbr = (HBRUSH)::SelectObject( hdc, hbrOld );	// 기존 브러쉬 선택
	hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존 펜 선택
	::DeleteObject( hbr );	// 생성한 브러쉬 삭제
	::DeleteObject( hpen );	// 생성한 펜 삭제

	// todo .. : 다각형 그리기
	hbr = (HBRUSH)::GetStockObject( NULL_BRUSH );	// 투명 브러쉬
	hpen = CreatePen( PS_DOT, 1, RGB( 255, 0, 0 ) );	// 선 스타일, 굵기, 색상
	hbrOld = (HBRUSH)::SelectObject( hdc, hbr );	// 브러쉬 선택
	hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
	CPoint apnt[5];
	apnt[0].x = 210;
	apnt[0].y = 10;
	apnt[1].x = 250;
	apnt[1].y = 10;
	apnt[2].x = 250;
	apnt[2].y = 30;
	apnt[3].x = 230;
	apnt[3].y = 60;
	apnt[4].x = 210;
	apnt[4].y = 30;
	::Polygon( hdc, apnt, 5 );
	hbr = (HBRUSH)::SelectObject( hdc, hbrOld );	// 기존 브러쉬 선택
	hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존 펜 선택
	::DeleteObject( hbr );	// 생성한 브러쉬 삭제
	::DeleteObject( hpen );	// 생성한 펜 삭제
	
	// todo .. : 선 그리기
	hpen = CreatePen( PS_DASHDOT, 1, RGB( 255, 0, 0 ) );	// 선 스타일, 굵기, 색상
	hpenOld = (HPEN)::SelectObject( hdc, (HGDIOBJ)hpen );	// 펜 선택
	::MoveToEx( hdc, 270, 10, NULL );
	::LineTo( hdc, 300, 20 );
	hpen = (HPEN)::SelectObject( hdc, hpenOld );	// 기존 펜 선택
	::DeleteObject( hpen );	// 생성한 펜 삭제

	::SelectObject( hdc, hbmpOld );	// 기존 HBITMAP으로 돌리기
	::DeleteObject( hbmp );			// 사용한 HBITMAP 지우기
	::ReleaseDC( hwnd, hdc );		// HDC 해제
	::DeleteDC( hdc );				// HDC 지우기
}

이상으로 도형의 선 색, 굵기, 선 스타일, 브러쉬 색, 브러쉬 스타일, 투명 옵션에 대해 알아보았습니다.