VS - Windows desktop application → ๋นํ๋ก์ ํธ
- ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ๋ํ ์ค๋ช
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์งํ๋จ์ ๋ฐ๋ผ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ํ๋๋ฐ ๋ฉ์ธ์ง ํ๋ก ์ด๋๋์ด ํ๋์ฉ ์ฒ๋ฆฌ๋๋ค.
- ์๋์ฐ ์์ฑ: ์๋์ฐ๋ฅผ ์์ฑ ์ ํ๋ฉด์ ํ์(์๋์ฐ์ ์์ฑ(ํฌ๊ธฐ, ์์น...๋ฑ์ ์ง์ )
- ๋ฉ์์ง ๋ฃจํ: ์๋์ฐ๊ฐ ์์ฑ ํ ํด๋น ์๋์ฐ์ ๋ํ ๋ฉ์์ง ๋ฃจํ ์์ (์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ์์คํ ์ด๋ฒคํธ ๋ฑ์ ๋ฉ์์ง๋ฅผ ๋๊ธฐํ๊ณ ์ฒ๋ฆฌํ๋ ์ญํ )
- ๋ฉ์์ง ์ฒ๋ฆฌ: ์ฌ์ฉ์์ ์ ๋ ฅ(๋ง์ฐ์ค, ํค๋ณด๋ ๋ฑ)์ด๋ ์์คํ ์ด๋ฒคํธ(์๋์ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ, ์ต์ํ ๋ฑ)๋ ๋ฉ์์ง์ ํํ๋ก ์๋์ฐ์ ์ ๋ฌ (๋ฉ์์ง ๋ฃจํ๋ ์ด ๋ฉ์์ง๋ฅผ ํ์์ ํ๋์ฉ ๊บผ๋ด์ด ์ ์ ํ ์ฒ๋ฆฌ ํจ์(์๋์ฐ ํ๋ก์์ )๋ก ์ ๋ฌ)
- ์๋์ฐ ํ๋ก์์ : ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ์ํํจ
// ์ ์ญ ๋ณ์:
HINSTANCE hInst; // ํ์ฌ ์ธ์คํด์ค์
๋๋ค.
WCHAR szTitle[MAX_LOADSTRING]; // ์ ๋ชฉ ํ์์ค ํ
์คํธ์
๋๋ค.
WCHAR szWindowClass[MAX_LOADSTRING]; // ๊ธฐ๋ณธ ์ฐฝ ํด๋์ค ์ด๋ฆ์
๋๋ค.
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// ์ ์ญ ๋ฌธ์์ด ์ด๊ธฐํ
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINDOWSPROJECT, szWindowClass, MAX_LOADSTRING);
// ์๋์ฐ ์ ๋ณด ๋ฑ๋ก
MyRegisterClass(hInstance);
// ์์ ์ ๋ณด ํ ๋๋ก ์๋์ฐ(์ฐฝ) ์์ฑ
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// ๋จ์ถํค ํ
์ด๋ธ ์ ๋ณด ๋ก๋ฉ
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT));
MSG msg;
// GetMessage
// ๋ฉ์ธ์ง ํ์์ ๋ฉ์ธ์ง ํ์ธ ๋ ๋๊น์ง ๋๊ธฐ
// msg.message == WM_QUIT ๊ฒฝ์ฐ false ๋ฐํ -> ํ๋ก๊ทธ๋จ ์ข
๋ฃ
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
// ์ฐฝ์ ๋ํ ์ ๋ณด
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
// ์๋์ฐ ์ฐฝ ๋ง๋ค๊ธฐ(OS๊ดํ ) -> ์ฌ๋ฌ ํจ์์ ID์ค -> ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ด์ฉํด ์ฝ๋ฉํ๋ ๊ฒ
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
// ์ฃผ๋ก ์์
ํ๋ ๋ถ๋ถ -> ํ๋ก์์
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
- ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ & WM_PAINT
: ์ฐ๋ฆฌ๋ ์ด์์ฒด์ ๊ฐ ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ(์ปค๋ ์ค๋ธ์ ํธ)๋ฅผ ๋ง์๋๋ก ์ธ ์ ์๋ค
→ OS๋ ์๋์ฐ ์์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ด๋ค
(์ฌ๊ธฐ์ ๊ฐ์ฒด๋ HPEN, HDC, HWND ๋ฑ ๋ค์ํ ๋๊ตฌ๋ค์ด๋ผ ๋ณด๋ฉด ๋๊ฒ ๋ค)
์ฌ๊ฐํ ํ๋๋ฅผ ๊ทธ๋ ค๋ณด์. ์์ ์ฝ๋์์ WM_PAINT ๋ถ๋ถ๋ง์ ๊ฑด๋ค์ด๋ฉด ๋๋ค.
WM_PAINT → ์๋์ฐ์ ๊ทธ๋ ค์ผ ํ ์ํฉ์ ๋ฐ์ํ๋ ๋ฉ์ธ์ง
* ์ฌ๊ธฐ์ ๊ทธ๋ ค์ผ ํ ์ํฉ์ด๋? ๋ฌดํจํ(invalidate) ์์ญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ๋ก ์ ์
* ๋ฌดํจํ : ํ ๋ฉด์ ๊ฐฑ์ ํด์ผ ํ๊ฑฐ๋ ๋ค์ ๊ทธ๋ฆด ๋๋ฅผ ์๋ฏธ. ์๋์ฐ์ ์ผ๋ถ๋ถ์ด๋ ์ ์ฒด๊ฐ ๋ค์ ๊ทธ๋ ค์ ธ์ผ ํ ๋ ์ฌ์ฉ๋จ
* ๋ฌดํจํ ์์ญ์ผ ๊ฒฝ์ฐ : ๋ค๋ฅธ ์๋์ฐ ์ฐฝ์ ๊ฐ๋ ค์ก๋ค๊ฐ ๋ค์ ๋๋ฅผ ๋ ๊ฒน์ณ์ก๋ ๋ถ๋ถ(์๋ ์ฌ์ง์ ๊ฒ์ ์ ๋ถ๋ถ)์ด ๋ฌดํจํ ์์ญ์ด๋ผ๋ ๊ฒ์ ์์ ์ ํด๋น๋๋ ๋ง → ํ์ฌ๋ ๋ค์ ๊ทธ๋ฆด ํ์ ์์ด์ WM_PAINT ๋ฉ์ธ์ง ๋ฐ์ X
๊ทธ๋ฌ๋ฉด ์ธ์ ๋ฌดํจํ ์์ญ์ด ๋ฐ์ํ๊ณ WM_PAINT๊ฐ ๋ฐ์ํ๋๊ฐ ?? → ์ฐฝ์ ์์ ๋ด๋ ธ๋ค๊ฐ ๋ค์ ํค๋ ๊ฒฝ์ฐ ๋ฐ์
์๋ฌดํผ ์ฌ๊ฐํ ํ๋๋ฅผ ๊ทธ๋ ค๋ณด์
// WndProc
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps); // Device Context ๋ง๋ค์ด์ ID ๋ฐํ (๊ทธ๋ฆฌ๊ธฐ)
Rectangle(hdc, 10, 10, 110, 110); // ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
EndPaint(hWnd, &ps); // ๊ทธ๋ฆฌ๊ธฐ ์ข
๋ฃ
}
break;
* Device Context ๋ฌด์์ธ๊ฐ?
: ๊ทธ๋ฆฌ๊ธฐ ์์ ์ํ์ ํ์ํ ๋ฐ์ดํฐ ์งํฉ์ด๋ผ ํ๊ณ HDC๋ผ๋ ์ ์ ๊ดํ ์ด๋ค
: DC์ ๋ชฉ์ ์ง๋ ํ์ฌ ์ํํ๊ณ ์๋ ์ฐฝ (hWnd) ์ด๊ณ ๊ธฐ๋ณธ ์ค์ ํ ์์ ๊ฒ์ , ๋ธ๋ฌ์ฌ๋ ํ์์์ด๋ค
→ ๊ทธ๋์ ์์ ์ฌ์ง์ด ํฐ ๋ฐฐ๊ฒฝ์ ํฌ๋ช ์ฌ๊ฐํ์ด ์๋๋ผ ํ์์ ๋ธ๋ฌ์ฌ๋ก ์์ ์น ํด์ ๋์จ ๊ฒ์ด๋ค
: ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ค๊ณ ํ ๋ ๋ํ์ง์ ๋๊ตฌ๊ฐ ํ์ํ๋ฏ, ์ฐฝ์ด ๋ํ์ง๋ฉฐ ๋๊ตฌ๋ ํ๊ณผ ๋ธ๋ฌ์ฌ ๋ฑ ๋ค์ํ๊ฒ ์๋ค
< Rectangle ํจ์ >
- hdc : ๋๋ฐ์ด์ค ์ปจํ ์คํธ์ ๋ํ ํธ๋ค (HDC)
- left : ์ฌ๊ฐํ์ ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ์ ์๋ ๋ ผ๋ฆฌ ์ขํ์ x ์ขํ
- top : ์ฌ๊ฐํ์ ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ์ ์๋ ๋ ผ๋ฆฌ ์ขํ์ y ์ขํ
- right : ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์๋ ๋ชจ์๋ฆฌ์ ์๋ ๋ ผ๋ฆฌ ์ขํ์ x ์ขํ
- bottom : ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์๋ ๋ชจ์๋ฆฌ์ ์๋ ๋ ผ๋ฆฌ ์ขํ์ y ์ขํ
๊ทธ๋ฌ๋ฉด ์ง์ ํ๊ณผ ๋ธ๋ฌ์ฌ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ ์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์์ง ์๋๊ฐ? → OK
// WndProc
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hRedPen = CreatePen(BS_SOLID, 1, RGB(255, 0, 0));
HBRUSH hBlackBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
HPEN hDefaultPen = (HPEN)SelectObject(hdc, hRedPen);
HBRUSH hDefaultBrush = (HBRUSH)SelectObject(hdc, hBlackBrush);
Rectangle(hdc, 10, 10, 110, 110);
SelectObject(hdc, hDefaultPen);
SelectObject(hdc, hDefaultBrush);
DeleteObject(hRedPen);
DeleteObject(hDefaultBrush)
EndPaint(hWnd, &ps);
}
break;
์ ๊ทธ๋ฆฌ๊ณ ๋ง์ ์ฌ๋๋ค์ด ๊ฝค ํท๊ฐ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ
switch-case๋ฌธ์์ ์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค๊ดํธ { ... } ๊ฐ ํ์ํ๋ค
< CreatePen ํจ์ >
: ์ง์ ํ์ ๋ง๋ค์ด์ ์ธ ์ ์๋ค. ํธ๋ค์ HPEN(ํ(์ ) ๊ฐ์ฒด)
- iStyle : ์๋์ ๊ฐ์ ๋ฃ์ด์ ๋ค์ํ๊ฒ ์ค์ ๊ฐ๋ฅํ๋ค. ํ์ฌ ์ฌ์ฉํ ๊ฒ์ PS_SOLID๋ก ์ค์ ์ ์๋ฏธ
- cWidth : ํ์ ๊ตต๊ธฐ (ํฝ์ ๋จ์). ํ์ฌ 1ํฝ์
- color : RGB ๋งคํฌ๋ก ์ด์ฉํด์ ์์ ์ง์ ํจ. ํ์ฌ RGB(255, 0, 0)์ผ๋ก ๋นจ๊ฐ์์ผ๋ก ์ง์ ๋จ
1) HPEN ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์๋ก์ด ํ์ ๋ง๋ ๊ฒ์ ๋ฃ๋๋ค(IDํ ๋น).
2) HBRUSH ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์๋ก์ด ๋ธ๋ฌ์ฌ๋ฅผ ๋ง๋ ๊ฒ์ ๋ฃ๋๋ค(IDํ ๋น).
3) HPEN, HBRUSH ๊ฐ์ฒด(hDefaultPen, hDefaultBrush)์ ์ด์ ์ ์ ํ๋์๋ ๊ฐ์ฒด์ ํธ๋ค์ ์ ์ฅํ๋ค.
4) ์ฌ๊ฐํ์ ๊ทธ๋ฆฐ ํ, ๋ค์ ์์ ๊ฒ์ ํ๊ณผ ํ์ ๋ธ๋ฌ์ฌ๋ฅผ ์ค์ ํ๊ณ ๋ง๋ค์๋ ๊ฐ์ฒด๋ฅผ ์ง์ด๋ค.
< GetStockObject ํจ์ >
: ์คํก ํ, ๋ธ๋ฌ์, ๊ธ๊ผด ๋๋ ํ๋ ํธ ์ค ํ๋์ ๋ํ ํธ๋ค์ ๊ฒ์ (= ํด๋น ๊ฐ์ฒด์ ๋ํด ๋ฏธ๋ฆฌ ์ ํด๋์ ๊ฐ์ ์ด์ฉํ๊ฒ ๋ค)
- i : ์์ฃผ ์ฐ๋ ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ๊ฒ์ด๋ค. ํ์ฌ BLACK_BRUSH๋ฅผ ํตํด ๊ฒ์ ์ ๋ธ๋ฌ์ฌ๋ฅผ ์ ํํด์ ์ฌ์ฉํ๊ณ ์๋ค.
๋ง์ฝ ๋ฏธ๋ฆฌ ์ ํด๋์๊ฒ ์๋ค๋ฉด PEN๊ณผ ๋ง์ฐฌ ๊ฐ์ง๋ก CreateSolidBrushํจ์๋ฅผ ์ด์ฉํด RGB๊ฐ์ ๋ฃ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ฌ๊ฐํ ์ด๋
์ด ์ฌ๊ฐํ์ ํค๋ณด๋๋ก ์ด๋ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ฐ์ ๊ธฐ์กด ์ฌ๊ฐํ ๊ทธ๋ฆด ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ค์ ๊ทธ๋ ธ๋ค๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ๊ฐ์ ๋ฐ๋ผ ๋ฐ๋์ด์ผ ํจ์ผ๋ก ๋ณ์๊ฐ ์์ผ ํ๋ค.
POINT ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์ขํ๊ฐ๊ณผ ํฌ๊ธฐ๋ฅผ ์ค์ ํ ํ ๊ทธ ์ขํ๊ฐ๊ณผ ํฌ๊ธฐ๋ฅผ ์ด์ฉํด์ ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ์
ํค๋ณด๋ ์ด๋์ ์ด๋ป๊ฒ ๋ฐ๋๊ฐ? → ์ฐ๋ฆฌ๊ฐ ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋ WM_KEYDOWN ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ๋ค.
์๋์ฐ ํ๋ก์์ ์์ wParam์ ํค๋ณด๋ id๊ฐ์ lParam์ ๋ง์ฐ์ค ์ขํ (ํด๋ผ์ด์ธํธ ๊ธฐ์ค (x, y))์ ๋ฐ๋๋ค
๋ฐ๋ผ์ WM_KEYDOWN ์์์ wParam์ ์ด์ฉํด ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค. ๋จ ๋ฌธ์ ์ ๋ ฅ์ 'W'์ ๊ฐ์ด ๋๋ฌธ์๋ก ๋ฐ์์ผ ํ๋ค.
์ํ์ข์ฐ ํค์ธ VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์ขํ ๊ฐ์ ์ฎ๊ฒจ๋ณด์
// ์ ์ญ๋ณ์
POINT objPos{ 500, 300 };
POINT objScale{ 100, 100 };
// WndProc
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps); /
HPEN hRedPen = CreatePen(BS_SOLID, 1, RGB(255, 0, 0));
HBRUSH hBlackBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
HPEN hDefaultPen = (HPEN)SelectObject(hdc, hRedPen);
HBRUSH hDefaultBrush = (HBRUSH)SelectObject(hdc, hBlackBrush);
Rectangle(hdc, objPos.x - objScale.x / 2,
objPos.y - objScale.y / 2,
objPos.x + objScale.x / 2,
objPos.y + objScale.y / 2);
SelectObject(hdc, hDefaultPen);
SelectObject(hdc, hDefaultBrush);
DeleteObject(hRedPen);
DeleteObject(hDefaultBrush);
EndPaint(hWnd, &ps);
}
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_UP:
objPos.y -= 10;
break;
case VK_DOWN:
objPos.y += 10;
break;
case VK_LEFT:
objPos.x -= 10;
break;
case VK_RIGHT:
objPos.x += 10;
break;
case 'W': // ๋ฌธ์๋ ๋๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ฆฐ๋ค
{
}
break;
}
}
break;
→ ์์์ง์ธ๋ค
์์ผ๊น? ๊ทผ๋ฐ ์ด๊ฑฐ ์ด๋ฌ๋ฉด ์์ง์ด๊ณ ์ฐฝ๋ด๋ ธ๋ค๊ฐ ์ฌ๋ฆฌ๋ฉด ๋ฐ๋์ด์ ธ ์์
ํค๋ ๋จน๋๋ฐ WM_PAINT์์ ๋ค์ ์๊ทธ๋ ค์ ๊ทธ๋ผ
์ด๊ฑฐ๋ฅผ ํค๋ง๋ค ๋ฃ์ด์ฃผ๋ฉด ์์ง์ผ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์๋ง ์ด๋ ๊ฒ ๋์ฌํ ๋ฐ, ์ด์ ์ ๊ทธ๋ ธ๋ ๊ฒ์ด ๋จ์์์ด์ ๊ทธ๋ ๋ค.
InvalidateRect(hWnd, nullptr, false)์์ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ฅผ false๋ก ์ฒ๋ฆฌํ๋ฉด
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ง์ ๋ ์๋์ฐ์ ์ ์ฒด ์์ญ์ ๋ฌดํจํํ๋ ๋ฐฐ๊ฒฝ์์ผ๋ก ์ฑ์ฐ์ง ์๋๋ค
๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ฅผ true๋ก ๋ฐ๊พธ๋ฉด ์ ์ฒด ์์ญ์ ๋ฐฐ๊ฒฝ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_UP:
objPos.y -= 10;
InvalidateRect(hWnd, nullptr, true);
break;
case VK_DOWN:
objPos.y += 10;
InvalidateRect(hWnd, nullptr, true);
break;
case VK_LEFT:
objPos.x -= 10;
InvalidateRect(hWnd, nullptr, true);
break;
case VK_RIGHT:
objPos.x += 10;
InvalidateRect(hWnd, nullptr, true);
break;
case 'W':
{
}
break;
}
}
๊ทผ๋ฐ ํ๋์ ํค๋ฅผ ๊ณ์ ๋๋ฅด๋ฉด ๋ฉ์ท๋ค๊ฐ 1์ด ์ง๋ ํ์์ผ ๊ณ์ ํค๋ฅผ ๋๋ฅด๋ ๊ฒ์ผ๋ก ์ธ์๋๋ค.
๊ฒ์ ๋ง๋ค ๋ ๋ด๊ฐ ํ๋ ์ดํ๋ ์บ๋ฆญํฐ๊ฐ ์ด๋ฐ๋ค๊ณ ์๊ฐํด๋ณด์. ์ด์ํ๋ค.
๋ค์ ์๊ฐ์ ๋ ์์๋ณด๋๋ก ํ๋ค
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 06] Key Manager (1) | 2024.06.04 |
---|---|
[winAPI 05] Double Buffering (0) | 2024.06.04 |
[winAPI 04] Timer (0) | 2024.04.09 |
[winAPI 03] Core class & Singleton (0) | 2024.04.08 |
[winAPI 02] ๋ง์ฐ์ค๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ & ๊ฒ์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๊ตฌ์กฐ (0) | 2024.04.08 |