League Of Legends - Link Select [winAPI 02] ๋งˆ์šฐ์Šค๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ & ๊ฒŒ์ž„ ๋ฉ”์„ธ์ง€ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 02] ๋งˆ์šฐ์Šค๋กœ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ & ๊ฒŒ์ž„ ๋ฉ”์„ธ์ง€ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ

by GAMEMING 2024. 4. 8.
728x90

 

 

 

* ๋ฌผ์ฒด๊ฐ€ ๋งŽ์ด ์กด์žฌํ•œ๋‹ค๋ฉด?

 ๋ฌผ์ฒด ๋งˆ๋‹ค ์ •๋ณด๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ํ•ญ์ƒ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์—†๊ณ , ์กฐ๊ธˆ๋งŒ ์›€์ง์—ฌ๋„ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ• ๊นŒ?

 ๊ฒŒ์ž„์€ '๋ Œ๋”๋ง' ์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ Œ๋”๋ง์€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋Š” ๋ฐ˜๋ณต์˜ ์—ฐ์†์ด๋ผ ์ƒ๊ฐํ•˜์ž.

 ํ”ํžˆ ํ”„๋ ˆ์ž„์ด๋ผ๊ณ  ์•Œ๊ณ  ์žˆ๋Š” ๊ฐœ๋… ๋งž์Œ ( 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