Rect

WanJu Kim·2023년 1월 2일
0

2D Project

목록 보기
2/13


창 하나 만들어서 이렇게 사각형 두 개 출력했고, 목표는 마우스를 사각형 안으로 들어 보내면 그 사각형 색깔이 바뀌게 하는 것이었다.

LRESULT Window::WndProc(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	ZeroMemory(&ps, sizeof(ps));
	HDC hdc;

	static RECT r1 = { 0 };
	static RECT r2 = { 0 };
	static HBRUSH brush = nullptr;
	static HBRUSH brush2 = nullptr;
	switch (message)
	{
		case WM_CREATE:
		{
			r1 = { 100,100,200,200 };
			r2 = { 400,400,500,500 };
			brush = (HBRUSH)CreateSolidBrush(RGB(255, 0, 0));
			brush2 = (HBRUSH)CreateSolidBrush(RGB(0, 255, 0));
			break;
		}
		case WM_PAINT:
		{
			hdc = BeginPaint(handle, &ps);
			{
				FillRect(hdc, &r1, brush);
				FillRect(hdc, &r2, brush2);
			}
			EndPaint(handle, &ps);
			break;
		}
		InvalidateRect(handle, NULL, TRUE);
		break;
	}
    
	...
}

처음에는 단지 마우스가 움직일 때 메시지 들어오는 case WM_MOUSEMOVE: 만 이용했었는데, 그러고 나니까 마우스 움직일 때마다 화면이 깜빡거리더라. 뭐가 문제였냐?

InvalidateRect(handle, NULL, TRUE);

이 함수가 문제였다. 제2 매개변수가 NULL로 지정돼있으면 전체 클라이언트 영역이 업데이트 된단다. 이 매개변수를 업데이트 시키고자 하는 사각형 주소를 주면 된다.

InvalidateRect(handle, &r1, TRUE);

그렇게 마우스를 움직일 때 메시지 들어오는 문구와 함께 작성한 코드.

LRESULT Window::WndProc(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	ZeroMemory(&ps, sizeof(ps));
	HDC hdc;

	static RECT r1 = { 0 };
	static RECT r2 = { 0 };
	static HBRUSH brush = nullptr;
	static HBRUSH brush2 = nullptr;
	static HBRUSH brush3 = nullptr;
	switch (message)
	{
		case WM_CREATE:
		{
			r1 = { 100,100,200,200 };
			r2 = { 400,400,500,500 };
			brush = (HBRUSH)CreateSolidBrush(RGB(255, 0, 0));
			brush2 = (HBRUSH)CreateSolidBrush(RGB(0, 255, 0));
			brush3 = (HBRUSH)CreateSolidBrush(RGB(0, 0, 255));
			break;
		}
		case WM_PAINT:
		{
			hdc = BeginPaint(handle, &ps);
			{
				FillRect(hdc, &r1, brush);
				FillRect(hdc, &r2, brush2);
			}
			EndPaint(handle, &ps);
			break;
		}
		case WM_MOUSEMOVE:
		{
			int x = LOWORD(lParam);
			int y = HIWORD(lParam);
			hdc = BeginPaint(handle, &ps);
			{
				if (x < r1.right && x > r1.left && y < r1.bottom && y > r1.top)
				{
					brush = (HBRUSH)CreateSolidBrush(RGB(0, 0, 255));
				}
				else
				{
					brush = (HBRUSH)CreateSolidBrush(RGB(255, 0, 0));
				}
			}
			EndPaint(handle, &ps);
			InvalidateRect(handle, &r1, TRUE);
			break;
		}
		
		InvalidateRect(handle, NULL, TRUE);
		break;
	}
	...
}
profile
Question, Think, Select

0개의 댓글