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