profile image

L o a d i n g . . .

Published 2020. 5. 28. 21:10
반응형

1. 마우스 입력받기

POINT _ptMouse;

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC			hdc;	//Device Context

	switch (iMessage)
	{
	case WM_CREATE:
	{
	}
	break;
	// 마우스를 움직일 때
	case WM_MOUSEMOVE:
	{
    // 마우스의 좌표를 받아서 POINT에 저장
		_ptMouse.x = LOWORD(lParam);
		_ptMouse.y = HIWORD(lParam);

		InvalidateRect(hWnd, NULL, true);
	}
	break;
	// 마우스 왼쪽을 누를 때
	case WM_LBUTTONDOWN:
	{

	}
	break;
	// 마우스 왼쪽을 눌렀다가 뗄 때
	case WM_LBUTTONUP:
	{

	}
	break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}

	return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}

 

2. 마우스가 RECT 위에 있는지 확인하기

RECT 위를 클릭했을 경우, RECT를 움직이기 위하여 다음과 같이 작성하였다.

// 마우스 왼쪽을 누를 때
case WM_LBUTTONDOWN:
{
	if (_ptMouse.x > _rc.left && _ptMouse.x < _rc.right &&
		_ptMouse.y > _rc.top && _ptMouse.y < _rc.bottom)
	{
		_aX = LOWORD(lParam) - ((_rc.right + _rc.left) / 2);
		_aY = HIWORD(lParam) - ((_rc.top + _rc.bottom) / 2);
		isMouseDown = true;
	}
}

이때, PtInRect()를 이용한다면, if문 안의 조건을 더욱 간단하게 처리할 수 있다. 포인트가 RECT 범위에 있는지 체크한다.

if (PtInRect(&_rc, _ptMouse))
{
// ...
}

 

3. enum과 RECT

RECT를 각각 처리할 수도 있지만, RECT형의 배열과 enum을 이용하면 보다 간편하게 RECT형을 다룰 수 있다.

enum BOX
{
	BOX_FIRST,
	BOX_SECOND,
	BOX_IN,
	BOX_END,
};

BOX CURRENTBOX;
RECT rc[BOX_END];

일반 자료형 배열과 마찬가지로 for문을 이용하여 접근이 가능하다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	// ...
	switch (iMessage)
	{
	case WM_CREATE:
	{
		rc[BOX_FIRST] = RectMakeCenter(WINSIZEX / 2 - 150, WINSIZEY / 2, 100, 100);
		rc[BOX_SECOND] = RectMakeCenter(WINSIZEX / 2 + 150, WINSIZEY / 2, 100, 100);
		rc[BOX_IN] = RectMakeCenter(WINSIZEX / 2 - 150, WINSIZEY / 2, 50, 50);

		CURRENTBOX = BOX_FIRST;
	}
	break;
	case WM_PAINT:
	{
		hdc = BeginPaint(hWnd, &ps);

		for (int i = 0; i < BOX_END; i++)
			Rectangle(hdc, rc[i].left, rc[i].top, rc[i].right, rc[i].bottom);

		EndPaint(hWnd, &ps);
	}
	break;
    // ...
}
반응형
복사했습니다!