ํค๋ณด๋ ์ ๋ ฅ
์ปดํจํฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ์ถ๋ ฅ ์ฅ์น๋ ์์ง๊น์ง๋ ํค๋ณด๋์ด๋ค. ํค๋ณด๋๋ก๋ถํฐ ์ ๋ ฅ์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ ์๋์ฐ์ฆ๋ ํฌ์ปค์ค๋ฅผ ๊ฐ์ง ํ๋ก๊ทธ๋จ์๊ฒ ํค๋ณด๋ ๋ฉ์์ง(WM_CHAR)์ ๋ณด๋ด์ฃผ๋ฉฐ ํ๋ก๊ทธ๋จ์ ์ด ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ํค๋ณด๋ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค.
์ฌ๊ธฐ์ ํฌ์ปค์ค(focus)์๋์ฐ๋ ํ์ฑํ ๋์ด ์๋ ์๋์ฐ๋ฅผ ๋งํ๋ฉฐ ํ๋ฒ์ ์ค์ง ํ๋์ ํ๋ก๊ทธ๋จ๋ง ํ์ฑํ ๋๋ค. ์๋ฌด๋ฆฌ ์ฌ๋ฌ๊ฐ์ ํ๋ก๊ทธ๋จ์ด ๋์์ ์คํ๋๋ ๋ฉํฐ ํ์คํน ํ๊ฒฝ์ด๋ผ๋ ํ์ฑํ ๋ ์ ์๋ ํ๋ก๊ทธ๋จ์ ์ค์ง 1๊ฐ ๋ฐ์ ์์ผ๋ฉฐ ํ์ฑํ๋ ํ๋ก๊ทธ๋จ๋ง ํฌ์ปค์ค๋ฅผ ๊ฐ์ง๊ณ ํค๋ณด๋ ์ ๋ ฅ์ ๋ฐ์๋ค์ผ ์ ์๋ค. ์๋ํ๋ฉด ์์คํ ์ ํค๋ณด๋๋ ํ๋ ๋ฟ์ด๋ฉฐ ํค๋ณด๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฉ์๋ ํ๋ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ ํ๋ ์์ํฌ๋ WM_KEYDOWN๋ฉ์ธ์ง๋ฅผ ์ ๋ ฅ๋ฐ์์ ํค๋ณด๋ ์ ๋ ฅ์ฒ๋ฆฌ๋ฅผ ์งํํ ๊ฒ์ด๋ค.
case WM_KEYDOWN:
{
POINT ptPos = player.GetPos();
switch (wParam)
{
case 'W':
ptPos.y -= 1;
break;
case 'S':
ptPos.y += 1;
break;
case 'A':
ptPos.x -= 1;
break;
case 'D':
ptPos.x += 1;
break;
}
player.SetPos(ptPos.x, ptPos.y);
// ๋ฌดํจํ์์ญ ๋ฐ์์ํค๊ธฐ(WM_PAINT ๋ฉ์ธ์ง)
InvalidateRect(hWnd, nullptr, false);
}
๋ฌดํจํ ์์ญ
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด 2๊ฐ์ ์๋์ฐ๊ฐ ๊ฒน์ณ์ ธ ์๊ณ ๋ฉ๋ชจ์ฅ์ ๋ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด ์ฎ๊ฒจ์ง๊ธฐ ์ ์ ๊ฒน์ณ์ก๋ ๋ถ๋ถ์ด ๋ฌดํจํ ์์ญ์ด ๋๋ค. ์ฆ ๋ฌดํจํ๋ค๋ ๋ง์ ์๋ ๊ทธ๋ ค์ ธ์ผ ํ ๋ชจ์ต๊ณผ๋ ๋ค๋ฅธ ๋ชจ์ต์ ๊ฐ์ง๊ณ ์๋ค๋ ๋ป์ด๋ฉฐ ๊ณง ๋ค์ ๊ทธ๋ ค์ ธ์ผ ํ ํ์๊ฐ ์๋ค๋ ์๋ฏธ์ด๋ค. ์๋์ฐ์ฆ๋ ์ด๋ค ์๋์ฐ๊ฐ ๋ฌดํจ ์์ญ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด WM_PAINT ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ฃผ์ด ์๋์ฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋๋ก ํด ์ฃผ๋ฉฐ ์ด ๊ฒฝ์ฐ ๊ณ์ฐ๊ธฐ ํ๋ก๊ทธ๋จ์ผ๋ก WM_PAINT ๋ฉ์ธ์ง๊ฐ ์ ๋ฌ๋์ด ๊ณ์ฐ๊ธฐ๋ก ํ์ฌ๊ธ ์์ ์ ๋ค์ ๊ทธ๋ฆฌ๋๋ก ํ ๊ฒ์ด๋ค. ์ต๊ทผ ์๋์ฐ ๋ฒ์ ์๋ ์ด๋ฐ ๊ฐ๋จํ ์๋์ฐ ๊ฒน์นจ์ผ๋ก ๋ฌดํจํ ์์ญ์ด ๋ฐ์ํ์ง๋ ์๋๋ค. ์์๋ฅผ ์ํด์ ์ค๋ช ํ ์๋ฃ์ด๋ค.
BOOL InvlidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);
์ด ํจ์๋ ์๋์ฐ์ ์์ ์์ญ์ ๋ฌดํจํ์์ผ ์๋์ฐ์ฆ๋ก ํ์ฌ๊ธ WM_PAINT ๋ฉ์ธ์ง๋ฅผ ํด๋น ์๋์ฐ๋ก ๋ณด๋ด๋๋ก ํ๋ค. ์ฒซ๋ฒ์งธ ์ด์ hWnd๋ ๋ฌดํจํ์ ๋์์ด ๋๋ ์๋์ฐ, ์ฆ ๋ค์ ๊ทธ๋ ค์ ธ์ผํ ์๋์ฐ ํธ๋ค์ด๋ค.
๋๋ฒ์งธ ์ธ์๋ ๋ฌดํจํ์์ผ์ผํ ์๋์ฐ ์์ญ์ด๋ค. null์ ๋ฃ์ผ๋ฉด ์ ์ฒด์์ญ์ด ์ ๋ถ ๋ฌดํจํ๊ฐ ๋๋ค.
์ธ๋ฒ์งธ ์ธ์๋ ๋ฌดํจํ๋๊ธฐ ์ ์ ๋ฐฐ๊ฒฝ์ ๋ชจ๋ ์ง์ด ํ ๋ค์ ๊ทธ๋ฆด ๊ฒ์ธ์ง ์๋๋ฉด ๋ฐฐ๊ฒฝ์ ์ง์ฐ์ง ์๊ณ ๊ทธ๋ฆด ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ค.
๋ฉ์ธ์ง ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ ๋จ์
// ๊ธฐ๋ณธ ๋ฉ์์ง ๋ฃจํ์
๋๋ค:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
๋ฉ์์ง ๊ธฐ๋ฐํ๋ก๊ทธ๋จ์ ๋จ์ ์ ํน์ ๋ฉ์ธ์ง(์ด๋ฒคํธ)๊ฐ ์์๋๋ง ํน์ ์ฝ๋๊ฐ ๋์๋๋ค๋ ์ ์ด๋ค.
์ผ๋ฐ์ ์ธ ์์ฉํ๋ก๊ทธ๋จ์์๋ ์๊ด์ด ์์ง๋ง ๊ฒ์์ ํ๋ ์ด์ด๊ฐ ๋ฉ์ถฐ ์์ด๋ ๋ชฌ์คํฐ๋ ์์ง์ฌ์ค์ผํ๋ ์ํฉ์ด ๋ง์ผ๋ฏ๋ก
GetMessageํจ์๋ฅผ ํตํ ๋ฉ์ธ์ง๊ธฐ๋ฐ์ผ๋ก ๊ฒ์์ ๋ง๋ค๊ธฐ์๋ ์ ํฉํ์ง ์๋ค.
winAPI์์๋ SetTimer()ํจ์๋ฅผ ํตํ ์ด๋จ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํด์ค์ ์์ง๋ง ์ด๋ํ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค.
๊ฒ์์ฒ๋ผ ๋์๊ฐ๊ธฐ ์ํด์ GetMessage๊ฐ ์๋ ๋งคํ๋ ์๋ง๋ค ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์๋
PeekMessage๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. PeekMessage๋ ๋ง์ง๋ง ์ธ์๋ก PM_REMOVE๋ฅผ ๋ฃ์ด์ค์ผ ๋ฉ์ธ์งํ์์ ๋ฉ์ธ์ง๋ฅผ ์ญ์ ํด์ค๋ค.
// PeekMessage : ํ๋ก์ธ์ค์ ๋ฐ์ํ ๋ฉ์์ง๋ฅผ ๋ฉ์ธ์งํ์์ ๊บผ๋ด์ด
// PM_REMOVE -> ๋ฐ์ํ ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ฉ์ธ์งํ์์ ์ ๊ฑฐ (GetMessage ๋ ๋์ผํ๊ฒ ํ๊ธฐ ์ํด์...)
// ๋ฉ์ธ์งํ์ ๋ฉ์ธ์ง ์ /๋ฌด ์ ์๊ด์์ด ํจ์๊ฐ ๋ฆฌํด๋จ
// ๋ฆฌํด๊ฐ์ด true ์ธ ๊ฒฝ์ฐ ๋ฉ์ธ์ง๊ฐ ์์๋ค. ๋ฆฌํด๊ฐ์ด false ์ธ ๊ฒฝ์ฐ ๋ฉ์ธ์ง๊ฐ ํ์ ์์๋ค.
// ๊ธฐ๋ณธ ๋ฉ์์ง ๋ฃจํ์
๋๋ค:
//while (GetMessage(&msg, nullptr, 0, 0))
while(true)
{
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
if (WM_QUIT == msg.message)
break;
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
//์ฌ๊ธฐ์์ ๊ฒ์ ๋ก์ง์ด ์คํ๋ ๊ฒ์ด๋ค.
}
}
if (msg.message == WM_QUIT)
{
//
}
'๐ Development Study > ๐ป Win32API' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Scene, Object, Time (0) | 2022.09.15 |
---|---|
Singleton Patten (0) | 2022.09.13 |
DC์ ์ ๋ณด์์ (0) | 2022.09.06 |
WinMain (2) | 2022.09.05 |
์ค๋ฒ๋ก๋ฉ๊ณผ ํ ํ๋ฆฟ (0) | 2022.08.18 |
๋๊ธ