[WinAPI] HDC 1 – 사각형, 원, 다각형, 선 그리기

[WinAPI] HDC 1 – 사각형, 원, 다각형, 선 그리기

오늘은 HDC를 이용하여 사각형, 원, 다각형을 그려보도록 하겠습니다.

만들어보기 전에 윈도우에서 좌표 계산 방법은 아래와 같습니다.
x좌표는 왼쪽에서 오른쪽으로 숫자가 증가하고,
y좌표는 일반적인 2차원 좌표와 반대로 위에서 아래로 숫자가 증가하는 방식 입니다.

좌표를 유의해 주시고, 이제 만들어 보겠습니다.

프로젝트를 하나 생성해 주시고 아래 그림과 같이 Static Control을 만들어서 속성을 설정합니다.

그리고 확인 버튼을 더블클릭 한 후 아래와 같이 구현합니다.

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 선택하기

	// todo .. : 사각형 그리기

	// todo .. : 원 그리기

	// todo .. : 다각형 그리기

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

위 코드 설명은 주석을 보시면 됩니다.
윈도우 자체가 어떻게 그리는지 개념을 알고싶으시면 dc, bitmap, hwnd, handle의 개념에 대해서 공부하시길 추천 바랍니다.

사각형을 그리시려면 “// todo .. : 사각형 그리기” 하단에 아래와 같이 코딩하시면 됩니다.

// todo .. : 사각형 그리기
::Rectangle( hdc, 10, 10, 100, 100 );

사각형의 좌표 표시는 아래 그림을 참고해주세요.

원을 그리시려면 “// todo .. : 원 그리기” 하단에 아래와 같이 코딩하시면 됩니다.

// todo .. : 원 그리기
::Ellipse( hdc, 110, 10, 200, 100 );

원의 좌표 표시는 아래 그림을 참고해 주세요. 가상의 네모에 딱 맞는 원이 있다고 생각하시면 됩니다.

다각형을 그리시려면 “// todo .. : 다각형 그리기” 하단에 아래와 같이 코딩하시면 됩니다.

// todo .. : 다각형 그리기
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 );

다각형의 좌표 표시는 아래 그림을 참고해 주세요. Polygon의 경우, 그리는 순서대로 좌표를 입력하셔야 합니다.
아래 그림의 숫자처럼 0~4번 순서대로 CPoint 배열에 입력해주세요.

선을 그리시려면 “// todo .. : 선 그리기” 하단에 아래와 같이 코딩하시면 됩니다.

// todo .. : 선 그리기
::MoveToEx( hdc, 270, 10, NULL );
::LineTo( hdc, 290, 20 );

선의 좌표 표시는 아래 그림을 참고해 주세요.

이상으로 도형 그리기에 대해 알아보았습니다.

다음에는 HPEN과 HBRUSH를 이용하여 도형의 굵기과 배경색을 그리는 법에 대해 알아보겠습니다.