#include <windows.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_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = "Window Class 1";
RegisterClass(&WndClass);
hwnd = CreateWindow("Window Class 1",
"Window Title Name",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
270,
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;
RECT rect;
PAINTSTRUCT ps;
HBRUSH hBrush, oldBrush;
switch (iMsg)
{
case WM_CREATE:
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
rect.left = 100;
rect.top = 0;
rect.right = 150;
rect.bottom = 120;
Rectangle(hdc, 100, 0, 150, 120);
DrawText(hdc, "위쪽", 4, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.left = 50;
rect.top = 0;
rect.right = 100;
rect.bottom = 350;
Rectangle(hdc, 50, 120, 100, 240);
DrawText(hdc, "왼쪽", 4, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.left = 150;
rect.top = 110;
rect.right = 200;
rect.bottom = 240;
Rectangle(hdc, 150, 120, 200, 240);
DrawText(hdc, "오른쪽", 6, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.left = 50;
rect.top = 180;
rect.right = 200;
rect.bottom = 400;
Rectangle(hdc, 100, 240, 150, 350);
DrawText(hdc, "아래쪽", 6, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(255, 0, 0));
oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, 100, 0, 150, 120);
SelectObject(hdc, oldBrush);
DeleteObject(hBrush);
ReleaseDC(hwnd, hdc);
break;
case VK_LEFT:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(255, 0, 0));
oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, 50, 120, 100, 240);
SelectObject(hdc, oldBrush);
DeleteObject(hBrush);
ReleaseDC(hwnd, hdc);
break;
case VK_RIGHT:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(255, 0, 0));
oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, 150, 120, 200, 240);
SelectObject(hdc, oldBrush);
DeleteObject(hBrush);
ReleaseDC(hwnd, hdc);
break;
case VK_DOWN:
hdc = GetDC(hwnd);
hBrush = CreateSolidBrush(RGB(255, 0, 0));
oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, 100, 240, 150, 350);
SelectObject(hdc, oldBrush);
DeleteObject(hBrush);
ReleaseDC(hwnd, hdc);
break;
}
case WM_KEYUP:
InvalidateRect(hwnd, NULL, true);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
욕 찰지게 먹을 코드네
슬쩍 봤는데, 니가 키를 누르면 WM_KEYDOWN 메시지가 넘어온 뒤 WM_KEYUP 이 넘어오고, Invalidate를 해주면 WM_PAINT 가 넘어오게 된다.
그리는 작업을 WM_PAINT 안에서 해주도록 통일하고 WM_KEYDOWN 과 WM_KEYUP 에선 전역변수의(예를들면 BOOL isKeyDown 과 int keyDirection) 값만 셋 해주고 Invalidate 만 하는 구조로 바꾸어야 될거다.
WM_PAINT 안에서 isKeyDown 과 keyDirection 값을 참고해서 다르게 그려주면 되는거지
별도의 off-screen buffer 에 그려놨다가 WM_PAINT 에서 반영하는 구조가 아니라면, 그리는 작업은 다 WM_PAINT로 보내는게 맞다. Invalidate 없으면 그려지질 않고.