딴짓거리 2022. 9. 18. 19:34

그림을 그린다.

 

물론 자유롭게 그림을 그리는 것은 아니고

 

점과 선을 이용한 기본 도형이다.

 

#include <windows.h>
#include <TCHAR.H>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
	HWND		hwnd;
	MSG			msg;
	WNDCLASS	WndClass;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	WndClass.lpfnWndProc = WndProc;
	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hInstance = hInstance;
	WndClass.hIcon = LoadIcon(NULL, IDI_QUESTION);		//윈도우 아이콘
	WndClass.hCursor = LoadCursor(NULL, IDC_IBEAM);		//커서 모양
	WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);	//배경 색
	WndClass.lpszMenuName = NULL;	//메뉴 이름
	WndClass.lpszClassName = _T("Window Class Name");	//윈도우 클래스 이름
	RegisterClass(&WndClass);
	hwnd = CreateWindow(_T("Window Class Name"),
		_T("Cobaltbru's First Window"),		//윈도우 타이틀 이름
		WS_OVERLAPPEDWINDOW,		//윈도우 스타일
		200,	//윈도우 위치 X
		300,	//윈도우 위치 Y
		600,	//윈도우 가로
		400,	//윈도우 세로
		NULL,
		NULL,
		hInstance,
		NULL
	);
	ShowWindow(hwnd, nCmdShow);		//윈도우 기본 출력 함수
	UpdateWindow(hwnd);
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)	//메시지 처리 함수
{
	HDC				hdc;
	PAINTSTRUCT		ps;
	POINT			point[10] = { {10,200},{250,80},{500,200},{350,350},{150,350} };
	HPEN			hPen, oldPen; // 펜
	HBRUSH			hBrush, oldBrush; // 면
	switch (iMsg)
	{
	case WM_CREATE:
		break;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		hPen = CreatePen(PS_DOT, 1, RGB(255, 0, 0)); // 펜 생성
		oldPen = (HPEN)SelectObject(hdc, hPen); // 생성한 펜 지정후 반환된 원래 펜 저장
		Ellipse(hdc, 0, 0, 40, 80); // 원(타원) 그리기
		SelectObject(hdc, oldPen); // 저장해두었던 원래 펜 지정
		DeleteObject(hPen); // 만들었던 펜 삭제

		hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
		oldPen = (HPEN)SelectObject(hdc, hPen);
		Rectangle(hdc, 100, 0, 140, 40);// 사각형 그리기
		SelectObject(hdc, oldPen);
		DeleteObject(hPen);

		hBrush = CreateSolidBrush(RGB(0, 255, 0)); // 브러쉬 생성(색 채우기)
		oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
		Polygon(hdc, point, 5); // 다각형 그리기
		SelectObject(hdc, oldBrush);
		DeleteObject(hBrush);

		EndPaint(hwnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}	//처리할 메시지만 case문에 나열
	return DefWindowProc(hwnd, iMsg, wParam, lParam);	//나머지는 커널이 처리
}

윈도우 API를 이용해 그림을 그리기 위해선 꽤나 까다로운 과정을 거쳐야 한다.

 

원하는 도형을 그릴 함수를 이용해 필요한 좌표를 입력후 출력한다.

 

예를 들어 원의 경우 일반적으로 중심점과 반지름을 입력하면 되겠다 싶지만

 

그럴경우 타원을 그릴때 또 다른 함수를 써야할 것이다.

 

그러므로 사각형을 그리듯이 대각선상의 두 꼭짓점의 좌표를 받은 후

 

해당 사각형에 내접하는 타원(혹은 원)을 출력하는 식이다.

 

 

해당 도형의 속성을 변경해줄때에도 다소 복잡한 과정을 거친다

 

도형을 그릴 선의 색과 형태를 바꾸고 싶을때는

 

일단 CreatePen 함수로 원하는 색과 형태의 펜 오브젝트를 생성한 다음

 

만든 SelectObject 함수로 펜을 선택 해준다.

 

이때 SelectObject는 원래의 기본 펜을 반환하므로 기본 펜의 정보는 다른 변수에 저장해 놓는다

 

도형을 생성한후

 

SelectObject함수로 원래의 기본 펜을 선택해 주고

 

반드시 새로 만들었던 펜을 DeleteObject 해줘야 한다.

 

 

면을 칠하는 브러쉬도 함수만 다르고 같은 프로세스를 거친다.

 

 

알록달록한 여러 도형을 생성했다

화면에 표시하려는 모든 것을 일일히 지정해줘야 하니 굉장히 복잡한 과정을 거쳐야 원하는 도형을 출력할 수 있다.