* ๋ฌผ์ฒด๊ฐ ๋ง์ด ์กด์ฌํ๋ค๋ฉด?
๋ฌผ์ฒด ๋ง๋ค ์ ๋ณด๊ฐ ์กด์ฌํด์ผ ํ๋ฉฐ ํญ์ ๋์ผํ๋ค๊ณ ์๊ฐํ ์ ์๊ณ , ์กฐ๊ธ๋ง ์์ง์ฌ๋ ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ ค์ผ ํ ๊น?
๊ฒ์์ '๋ ๋๋ง' ์ด๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ค. ์ฌ๊ธฐ์ ๋ ๋๋ง์ ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆฌ๋ ๋ฐ๋ณต์ ์ฐ์์ด๋ผ ์๊ฐํ์.
ํํ ํ๋ ์์ด๋ผ๊ณ ์๊ณ ์๋ ๊ฐ๋ ๋ง์ ( 1์ด์ 60๋ฒ์ ๊ทธ๋ฆฌ๋ ๊ฒ ๊ธฐ๋ณธ ) → ์ฆ ์ผ๋ง๋ ๊น๋ํ๊ฒ ๊ทธ๋ ค์ฃผ๋ ๊ฐ๊ฐ ๊ด๊ฑด์ด ๋จ
์๋์ ์์ ๋ฅผ ๋ณด์
- ๋ง์ฐ์ค๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
#include <vector>
using std::vector;
struct tObjInfo {
POINT objPos;
POINT objScale;
};
vector<tObjInfo> vecInfo;
POINT ptLT;
POINT ptRB;
bool act = false;
// 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);
if (act) {
Rectangle(hdc, ptLT.x, ptLT.y, ptRB.x, ptRB.y);
}
// ์ถ๊ฐ๋ ์ ๋ค draw
for (size_t i = 0; i < vecInfo.size(); ++i) {
Rectangle(hdc,
vecInfo[i].objPos.x - vecInfo[i].objScale.x / 2,
vecInfo[i].objPos.y - vecInfo[i].objScale.y / 2,
vecInfo[i].objPos.x + vecInfo[i].objScale.x / 2,
vecInfo[i].objPos.y + vecInfo[i].objScale.y / 2);
}
SelectObject(hdc, hDefaultPen);
SelectObject(hdc, hDefaultBrush);
DeleteObject(hRedPen);
DeleteObject(hDefaultBrush);
EndPaint(hWnd, &ps);
}
break;
case WM_LBUTTONDOWN:
{
ptLT.x = LOWORD(lParam);
ptLT.y = HIWORD(lParam);
act = true;
}
case WM_MOUSEMOVE:
ptRB.x = LOWORD(lParam);
ptRB.y = HIWORD(lParam);
InvalidateRect(hWnd, nullptr, true);
break;
break;
case WM_LBUTTONUP:
{
tObjInfo info={};
info.objPos.x = (ptLT.x + ptRB.x) / 2;
info.objPos.y = (ptLT.y + ptRB.y) / 2;
info.objScale.x = abs(ptLT.x - ptRB.x);
info.objScale.y = abs(ptLT.y - ptRB.y);
vecInfo.push_back(info);
act = false;
InvalidateRect(hWnd, nullptr, true);
}
break;
์ฐ์ ์ฌ๋ฌ ๊ฐ์ ์ฌ๊ฐํ์ ์ ์ฅํ๊ธฐ ์ํ ์ปจํ ์ด๋๋ฅผ ํ๋ ๋ง๋ค์ → vector
์ฌ๊ธฐ์ ์ปจํ ์ด๋๋ STL์๊ฐ ๋ ๋ฐฐ์ฐ๋๋ฐ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ ๋ณด๊ดํ๋ ํ๋์ ๋ณด๊ด์๋ผ๊ณ ๋ณด๋ฉด ์ข๋ค
๊ตฌ์กฐ์ฒด tObjInfo ๋ ์ ๋ฒ ์๊ฐ์ ์ฌ๊ฐํ์ ๋ง๋ค ๋ ํ์ํ ์ค์ฌ ์ขํ์ ๊ทธ๋ก๋ถํฐ์ ํฌ๊ธฐ๊ฐ ํฌํจ๋์ด ์๋ค
ptLT, ptRB๋ ๋ง์ฐ์ค๋ฅผ ๋๋ ์ ๋์ ๋์ ๋์ ๊ทธ ์ขํ ๊ฐ์ ๋ฐ๊ธฐ ์ํ ๋ณ์๋คact๋ ์ฌ๊ฐํ์ ๋ฌด์์ ๊ทธ๋ฆฌ์ง ์๊ธฐ ์ํด ํ์ํ ๋ณ์๋ค
WM_LBUTTONDOWN : ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ์ด ๋๋ ธ์ ๋ ๋ฉ์ธ์ง ๋ฐ์WM_MOUSEMOVE : ๋ง์ฐ์ค ์์ง์ผ ๋๋ง๋ค ๋ฉ์ธ์ง ๋ฐ์
WM_LBUTTONUP : ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ์ด ๋๋ ธ๋ค๊ฐ ๋ผ์ด์ก์ ๋ ๋ฉ์ธ์ง ๋ฐ์
lParam์ผ๋ก ์ ๋ฌ๋ ํ์ 16๋นํธ๋ X ์ขํ์ด๋ฉฐ, ์์ 16๋นํธ๋ Y ์ขํ์ด๋ค.
WM_LBUTTONDOWN์์ ๋ง์ฐ์ค๋ฅผ ๋๋ฅผ ๋ LOWORD(ํ์ 16๋นํธ ์ป์ด์ด)์ HIWORD(์์ 16๋นํธ ์ป์ด์ด)๋ฅผ ํตํด ๊ฐ ์ขํ๋ฅผ ptLT์ ์ ์ฅํ๊ณ act๋ฅผ true๋ก ํด์ค๋ค.
WM_MOUSEMOVE์์ ๋ง์ฐ์ค๊ฐ ์์ง์ผ ๋์ ์ขํ๋ฅผ ์ป์ด์ ptRB ์ ์ค์ ํ๊ณ ๋ฌดํจํ๋ฅผ ํด์ ๋ค์ ๊ทธ๋ฆผ. ๋ฌดํจํ ์ ํด์ฃผ๋ฉด ๋๋ฌ์ ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ด ์๋ณด์
WM_LBUTTONUP ์์ ๋ง์ฐ์ค๊ฐ ๋ผ์ด์ง ๋ ๊ฐ์ฒด tObjInfo์ ๊ฐ ptLT์ ptRB๋ฅผ ์ด์ฉํ์ฌ ์ค์๊ฐ๊ณผ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ค. ์ด๋ ptLT ์์ ptRB๋ฅผ ๋บ ๊ฐ์ด ์์๋ก ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค(์ฌ๊ฐํ์ ๊ทธ๋ฆด ๋ ๋๋๊ทธ๋ฅผ ์ผ์ชฝ์ด๋ ์๋ก ํ๋ ๊ฒฝ์ฐ). ๋ฐ๋ผ์ abs๋ฅผ ์ด์ฉํด ์ ๋๊ฐ์ ๊ตฌํด์ฃผ์.
์ด ๊ฐ์ฒด๋ฅผ vector์ ์ง์ด ๋ฃ๊ณ act๋ฅผ false๋ก ๋ฐ๊พผ๋ค.
WM_PAINT ๋ถ๋ถ์์ act๊ฐ true์ผ ๋ ์ฌ๊ฐํ์ ๊ทธ๋ฆฐ๋ค.๊ทผ๋ฐ ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ฌ๊ฐํ์ ๋ง๋ค์๊ณ ๊ทธ ๋๋ง๋ค vector์ ์ ์ฅํด์คฌ๋ค. ํ์ง๋ง ๋ฌดํจํ ์์ญ์ ๋ถ๋ฌ์ค๋ฉฐ ์ด์ ์ ๊ทธ๋ ธ๋ ๊ฐ์ฒด๊ฐ ์์ด์ง๋, ์ง๊ธ๊น์ง ์ ์ฅํ ์ปจํ ์ด๋์์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ ๊ทธ๋ ค์ค๋ค (๋ฐ๋ณต๋ฌธ ๋ถ๋ถ)
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค.
์ฒซ ๋ฒ์งธ๋ ๋ํ์ ๋ง์ด ๊ทธ๋ฆด ์๋ก ๊น๋นก์ด๋ ๊ฒ์ธ๋ฐ InvalidateRect ์ ๋ฌธ์ ๋ค.
ํ์ด๋ฐ์ ๋ฌธ์ ๋ก ๋น ๋ฅธ ์๊ฐ์ ์ ์ฒด ์์ญ์ ์ด๊ธฐํํ๊ณ ๋ค์ ๊ทธ๋ ค์ ์ฐ๋ฆฌ ๋์ ๊น๋นก๊น๋นก ์์ฒญ ํ๋ ๊ฒ
ํด๊ฒฐ ๋ฐฉ์์ ํ๋ฉด์ 2๊ฐ๋ก ๊ด๋ฆฌํ๋ ๋ฒ์ธ๋ฐ ํ๋ฉด์ 2๊ฐ๋ก ํด์ ํ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ์๋ ํ๋ฉด์ด๊ณ ๋ ํ๋๋ ๋ท ํ๋ฉด์์ ๋ค ๊ทธ๋ฆฐ ํ์ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ์๋ ํ๋ฉด์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ ๋ฒ์งธ๋ ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด ์๋์๊ฐ๋ ๊ฒ์ด๋ค. ์ง๊ธ์ ์ฐ๋ฆฌ๊ฐ ๋์ ์์ด ์ด๋ฒคํธ ๋ฉ์ธ์ง๊ฐ ๋์ค๋ ํ๋์ ํ๊ณ ์์ง๋ง,
๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฐ๋ฆฌ๊ฐ ์๋ฌด ํ์๋ฅผ ํ์ง ์์๋ ์๋์ ์ผ๋ก ์์ง์ด๋ obj๊ฐ ์์ ๊ฒ์ด๋ค. ๊ทผ๋ฐ ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด ๋ค์ ๊ทธ๋ฆฌ์ง ์์์ ๋ฉ์ถฐ์๋ค๋ ์ ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ SetTimer์ ์ด์ฉํด ๊ฐ์ ๋ก ๋ฉ์ธ์ง ๋ฐ๋ ์ํฌ ์ ์์ง๋ง ๊ต์ฅํ ๋๋ฆฌ๋ค. (๋งค๋ฒ ๋ฉ์ธ์ง๋ฅผ ์ด์ฉํ๋ค๋ ๊ฒ์ ์์คํ ์ฝ์ด๋ค) ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฐฉ์์ด ์๋๊ฐ ? → ๋ฉ์ธ์ง ์ฒ๋ฆฌ๊ธฐ ๋ฐ๊พธ๊ธฐ
- ๊ฒ์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๊ตฌ์กฐ
: ๋ฉ์ธ์ง ์ฒ๋ฆฌ๋ wWinMain์์ ์งํ๋๊ณ ์์๋ค. ์ ์ฒด์ ๊ตฌ์กฐ๋ ์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋๋ก ํ์.
2024.04.03 - [๐ค Study/winAPI] - [winAPI 01] Handle, DC, Window Event & ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
[winAPI 01] Handle, DC, Window Event & ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
VS - Windows desktop application → ๋นํ๋ก์ ํธ - ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ๋ํ ์ค๋ช ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์งํ๋จ์ ๋ฐ๋ผ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ํ๋๋ฐ ๋ฉ์ธ์ง ํ๋ก ์ด๋๋์ด ํ๋์ฉ ์ฒ๋ฆฌ๋๋ค. ์๋์ฐ ์์ฑ: ์๋์ฐ๋ฅผ ์
gameming.tistory.com
// ๊ธฐ์กด ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๋ฐฉ์
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
๊ทผ๋ฐ ์์ ๊ธฐ์กด ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๋ฐฉ์(GetMessage)์ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด ๊ตด๋ฌ๊ฐ์ง ์๋๋ก ํ๋ค. ๋ฐ๋ผ์ ์์ ์ด ์กฐ๊ธ ํ์ํ๋ค
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{
// ๋ฉ์ธ์ง ์์ ๋ ์ด ๋ถ๋ถ์ด ์งํ
}
}
PeekMessage()๋ ๋ฉ์ธ์ง ์ฌ์ฉ ๋ณด๊ฒ ๋ค๋ ์๋ฏธ๋ก ๋ฉ์ธ์งํ์์ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ๊ฒฝ์ฐ true, ์๋ ๊ฒฝ์ฐ false์ ๋ฐํํ๋ค. ๋ฉ์ธ์ง ์ ๋ฌด์ ์๊ด์์ด ๋์๊ฐ๋ฏ๋ก ๋๊ธฐ ํ ์ด์ ๊ฐ ์์ด ๊ณ์ ๋ฐํํ๋ค. ๋ง์ง๋ง (5๋ฒ์งธ) ์ธ์๋ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ๋ ๊ฒฝ์ฐ ๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ฅผ ์๋ฏธํ๋ค.
๋ง์ฝ ์ด ํจ์๊ฐ ์ฐธ์ผ ๊ฒฝ์ฐ WM_QUIT๊ฐ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ๋ ๋ฉ์ธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ else์ ํด๋นํ๋ ๋ถ๋ถ์ด ์คํ๋๋ค. ๋๋ถ๋ถ์ ์์ ์ ์๋ฌด๋ฆฌ ๋ฉ์ธ์ง๊ฐ ๋ง์ด ๋ฐ์ํด๋ ๋น์จ๋ก ๋ฐ์ง๋ฉด ๋๋ถ๋ถ์ ์๊ฐ์ด ๋ฉ์ธ์ง๊ฐ ์๋ ๋ถ๋ถ(else)์์ ์ฒ๋ฆฌ๋๋ค.
else๋ถ๋ถ์์ Game Code, ๋์์ธ ํจํด, ์ฑ๊ธํค ํจํด์ด ์คํ๋๋ค.
๋ค์ ์๊ฐ์ ์ฑ๊ธํค ํจํด์ ๋ํด ๊ณต๋ถํ๊ฒ ๋ค
'๐ค 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 01] Handle, DC, Window Event & ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2024.04.03 |