// 기본 메시지 루프입니다:
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 |