๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

FrameWork

by eazuooz 2022. 9. 7.

ํ‚ค๋ณด๋“œ ์ž…๋ ฅ

์ปดํ“จํ„ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž…์ถœ๋ ฅ ์žฅ์น˜๋Š” ์•„์ง๊นŒ์ง€๋Š” ํ‚ค๋ณด๋“œ์ด๋‹ค. ํ‚ค๋ณด๋“œ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์œˆ๋„์šฐ์ฆˆ๋Š” ํฌ์ปค์Šค๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ํ‚ค๋ณด๋“œ ๋ฉ”์‹œ์ง€(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

๋Œ“๊ธ€