반응형
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;
// ...
}
반응형