본문 바로가기

WinAPI

[WinAPI] PeekMessage와 윈도우 창 크기 설정

 // 기본 메시지 루프입니다:
    while (g_bLoop) {
        //PeekMessage는 메세지가 메세지 큐에 없어도 바로 빠져나온다.
        //메세지가 있을 경우 true 없을 경우  false가 된다.
        //메세지가 없는 시간이 윈도우의 데드 타임이다.
        if(PeekMessage(&msg, nullptr, 0, 0,PM_REMOVE))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }            
        }    
        //윈도우 데드타임일 경우
        else
        {         
            static int iCount;
            ++iCount;

            if (iCount == 30000)
            {
                iCount = 0;
                Run();
            }       
        }
    }

 

PeekMessage는 메세지큐가 비어있으면 false가 되어 바로 빠져나온 후 else 에 있는 구문을 계속 실행한다. 그래서 구현할 게임의 코드를 else 블럭 안에 구현한다. 그리고 실시간으로 움직이는 것을 구현할 때 너무 빠르게 많은 횟수로 실행하기 때문에 속도를 조절하기 위해 iCount가 30000번 채워질 때마다 명령을 한번씩 실행한다.

 

void Run() 
{
    if (GetAsyncKeyState('D') & 0x8000)
    {
        g_tPlayerRC.left += 1;
        g_tPlayerRC.right += 1;
    }
    Rectangle(g_hDC, g_tPlayerRC.left, g_tPlayerRC.top, g_tPlayerRC.right, g_tPlayerRC.bottom);
}

 

Run함수에서는 전역으로 선언한 HDC g_hDC와 Rect g_tPlayerRC를 이용해 사각형을 출력한다.

그리고 D를 누르면 사각형이 오른쪽으로 이동한다. GetAsyncKeyState는 D키가 눌렸는지 확인하고 0x8000(최상위 비트)와 &연산하는 이유는 D키가 현재 눌려져 있는 상태인지 확인하기 위해서이다. (정확한 시점 체크 가능)
PeekMessage를 이용하면 WM_PAINT를 호출하지 않아도 화면에 출력할 수 있다.

 

//실제 윈도우 타이틀바나 메뉴를 포함한 윈도우의 크기를 구해준다.
   RECT rc = { 0,0,800,600 };
   AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);

   //위에서 구해준 크기로 윈도우 클라이언트 영역의 크기를 맞춰줌
   SetWindowPos(hWnd, HWND_TOPMOST, 100, 100, rc.right - rc.left, rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER);

AdjustWindowRect는 실제 타이틀바, 메뉴를 포함한 윈도우의 크기를 구해준다.  rc의 right과 bottom은 800과 600으로 설정되어 있지만 실제 윈도우의 크기는 right이 808, bottom이 608이다 left와 top도 -8과 -31로 설정한 영역과 다르다.

그래서 SetWindowPos로 윈도우 창의 위치와 크기를 설정해줘야 한다.

 

    RECT rcWindow;
    GetClientRect(g_hWnd, &rcWindow);

GetClientRect는 윈도우 창의 크기가 늘어나고 줄어들 수 있는 것까지 고려해 현재 창의 크기를 rcWindow에 저장한다.

'WinAPI' 카테고리의 다른 글

[WinAPI] 더블 버퍼링  (0) 2022.01.20
[WinAPI] 삼각함수  (0) 2022.01.16
[WinAPI] 델타 타임  (0) 2022.01.16
[WinAPI] 도형 그리기, 마우스 좌표  (0) 2022.01.15
[WinAPI] 기본 윈도우 창  (0) 2022.01.15