코드/MFC

[MFC] 따라하기 01. 사각형 그리기

야곰야곰+책벌레 2022. 3. 2. 14:59
728x90
반응형

1. 프로젝트 예제에 사용되는 내용

  • Dialog Based 프로젝트 생성 방법
  • PaintDC()의 이해

2. 프로젝트 생성

MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다.

  1. File/New 메뉴를 선택한다.
  2. Project를 선택하면 Project 종류를 선택할 수 있다.
  3. Visual C++의 MFC 하위에 있는 'MFC Application'을 선택한다.
    이때 하단의 Project 이름을 넣을 수 있다. ( Sample은 DrawRect이라고 정했다. )

MFC Application 프로젝트는 3가지를 선택할 수 있습니다.

  • Single document : frame window가 있지만 child window가 아닌 프로젝트
  • Multiple document : frame window가 있으면서 child window를 가지는 프로젝트
  • Dialog based : 하나의 Dialog를 기반으로 하는 프로젝트

Dialog based 프로젝트가 간단한 응용프로그램을 만들기 편리하므로 Dialog based 프로젝트를 선택하고 finish를 누른다. 프로젝트가 생성되면 Dialog 하나와 프로젝트 파일들이 생성된다.

하단의 Solution/Class/Resoure View가 각각 존재하며 코드를 수정할 때 각각 사용된다.

  • Solution View : 프로젝트를 이루는 모든 파일을 볼 수 있다.
  • Class View : 클래스 단위로 나열해 주며, 클래스의 이벤트 등을 생성/삭제 등을 할 때 사용할 수 있다.
  • Resource View : 프로젝트의 리소스 편집할 때 유용하게 사용할 수 있다.

3. WM_PAINT 이벤트 및 사각형 그리기

Window나 Dialog에 그림을 그린 경우 다른 window에 의해서 혹은 모미터 밖으로 나가게 되면 지워지게 된다. 이는 보이지 않는 부분은 그리지 않는 것으로 OS의 효율적인 관리이며 이렇게 보이지 않아 처리되지 않는 부분을 무효화 영역이라고 한다. 이 무효화 영역이 다시 보이는 상태로 복귀하면 무효화된 부분을 복구시켜줘야 한다. 

이렇게 GUI를 다시 그려줘야 하는 경우에 발생하는 이벤트가 WM_PAINT다 WM은 Window Message의 약자로 기본적으로 정의된 시스템 메시지다. 

 

WM_PAINT 이벤트를 등록하면 OnPaint()라는 함수와 연결되는데, 클래스 뷰의 속성에서 확인할 수 있다.

무효화 과정에 대응하기 위해서 예제에서는 OnPaitn() 함수 내에 코딩하여 대응하도록 한다.

사각형을 그리려면 Retangle()이라는 함수를 사용하면 되지만, 나중을 위해서 MoveTo()와 LineTo()를 이용하기로 한다.

  • MoveTo() : Pen을 특정 위치로 이동시키는 함수다. 붓을 들고 이동한다.
  • LineTo() : 현재 Pen의 위치에서 원하는 위치까지 선을 그어주는 함수다. 붓을 내린 상태에서 이동한다.

LineTo()를 연속해서 호출하게 되면 직선을 계속해서 이어 긋게 된다. 선을 이어 긋고 싶지 않을 때에는 항상 MoveTo()로 Pen의 위치를 옮겨줘야 한다. OnPaint() 함수 내에 사각형을 그리는 코드를 추가해 보자.

void CDrawRectDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		// 여기에 사각형을 그리는 코드를 추가한다.
		CPaintDC dc(this); // device context for painting
		dc.MoveTo(10, 10);
		dc.LineTo(110, 10);
		dc.LineTo(110, 110);
		dc.LineTo(10, 110);
		dc.LineTo(10, 10);
        
		CDialogEx::OnPaint();
	}
}

상단 if (IsIconic()) 의 조건문은 Dialog 초기화 시 한번 호출되기 때문에 실제 Paint를 해야 하는 구문은 else 내에 작성한다. 그리기를 하기 위해서는 DC(Device Context)가 있어야 한다. OnPaint() 내부에서는 CPaintDC라는 것을 사용할 수 있다. 선언하고 MoveTo()와 LineTo()를 이용하여 사각형을 그려보자.

사각형이 그려짐을 확인할 수 있다.

01. 사각형 그리기 (DrawRect).zip
0.13MB

 

728x90
반응형