코드/MFC

[MFC] 따라하기 03. Edit box를 이용하여 여러 개의 사각형 그리기

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

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

  • for문 사용
  • Edit box 사용법
 

[MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기

1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생

stormpy.tistory.com

2. for문과 이용하여 3 x 3 개수의 사각형 그리기

이전 글까지 진행하면 (10, 10)에서 (110, 110)에 이르는 100 x 100 pixel의 사각형을 그리게 된다. 이제부터는 똑같은 사각형을 3x3으로 9개를 그려보자. 사각형은 100 pixel의 변을 가지고 있기 때문에 10 pixel의 간격을 둔다면 다음 사각형까지 110 pxiel이 필요하다. 110 pixel 마다 사각형을 그려보자.

 

첫 번째로 할 일은 시작점에 대응하는 사각형 그리기 함수를 수정하는 일이다. 기존과 다르게 CPoint를 사용해보자. CPoint는 x, y를 가지는 간단한 클래스다.

void CDrawRectDlg::DrawRectangle(CPoint pt, CPaintDC& dc)
{
	dc.MoveTo(pt);
	pt.Offset(100, 0);
	dc.LineTo(pt);
	pt.Offset(0, 100);
	dc.LineTo(pt);
	pt.Offset(-100, 0);
	dc.LineTo(pt);
	pt.Offset(0, -100);
	dc.LineTo(pt);
}

CPoint pt라는 시작점 위치를 받고, Offset을 통해서 x, y 위치를 이동할 수 있다. 나중에 100이라는 숫자를 변수로 선정하면 크기도 쉽게 변경할 수 있다. 이제 3x3으로 그려줄 수 있도록 반복문 for를 이용해야 한다.

		if (m_bDrawRect)
		{
			constexpr int dist = 110;
			
			for (int y = 0; y < 3; y++)
			{
				for (int x = 0; x < 3; x++)
				{
					DrawRectangle(CPoint(x*110 + 10, y*110 + 10), dc);
				}
			}
		}

시작점은 (10, 10)에서 시작하고 간격은 110 pixel인 사각형을 그리는 반복문이 만들어졌다. 실행을 하면 아래와 같이 제대로 동작함을 알 수 있다.

3. Edit Control로 가로, 세로 개수 입력 받기

이제 Edit box를 이용해서 사각형의 개수를 변경할 수 있도록 해보자.

리소스 뷰에서 도구 상자에서 Edit Control을 선택해서 Dialog에 놓아두도록 하자.

Static과 Edit Control을 위와 같이 놓고 X, Y 개수를 지정할 수 있도록 꾸민다. Edit Control의 속성에서 Number를 활성화(True) 시킨다. 입력으로 숫자만 받겠다는 의미다.

Edit Control을 선택한 뒤, 우클릭을 하여 Add Variable을 선택하면 오른쪽 창이 생성된다. 이때 Control Variable의 체크를 해제하고 type은 int로 name은 m_nXNums라고 하자. 이것은 Edit Control을 제어하는 것이 아닌 순수하게 값만 이용하겠다는 의미다. 두 개의 Edit Control의 변수를 생성하자.

변수가 생성되면 좌측(헤드 파일), 우측(소스파일)에 각각 생성된다. 해당 위저드를 사용하지 않고 수 작업으로 기입해도 제대로 동작한다. 이제 Edit box의 데이터를 이용하여 사각형을 그리기 위해서 데이터를 연결하자.

		UpdateData(TRUE);

		// 여기에 사각형을 그리는 코드를 추가한다.
		CPaintDC dc(this); // device context for painting

		if (m_bDrawRect)
		{
			constexpr int dist = 110;
			
			for (int y = 0; y < m_nYNums; y++)
			{
				for (int x = 0; x < m_nXNums; x++)
				{
					DrawRectangle(CPoint(x*110 + 10, y*110 + 10), dc);
				}
			}
		}

UpdateData(TRUE)는 리소스의 바뀐 부분을 데이터에 적용하라는 뜻이다. 이 함수를 호출하지 않으면 리소스에서 변경되어서 데이터로 적용되지 않는다. for문에 사용되는 X, Y의 개수를 Edit의 값으로 변경한다. 

 

이제 실행해보자.

제대로 동작한다.

 

DrawRect.zip
0.13MB

728x90
반응형