- AdjustWindowRect 함수
AdjustWindowRect(
_Inout_ LPRECT lpRect,
_In_ DWORD dwStyle,
_In_ BOOL bMenu);
첫 번째 인자는 LPRECT 타입, 그냥 RECT 구조체의 포인터 타입임.
두 번째 인자는 윈도우 스타일.
세 번째 인자는 메뉴바가 있는지를 입력한다.
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, true);
이런식으로 RECT 변수의 주솟값을 넘겨주면 입력과 출력을 동시에 하는 것처럼 동작.
그래서 SAL 주석으로 _Inout_ 이라고 적혀 있음.
내가 입력한 RECT 에다가 입력된 윈도우 스타일, 메뉴바 까지 고려해서 전체 크기를 계산해서 반환해준다.
윈도우 버전마다 메뉴바 같은 것들에 조금씩 픽셀 크기가 다르기 때문에, 이런 함수를 사용하는 것으로 보임.
- BeginPain 와 EndPaint
HDC hdc = BeginPaint(hWnd, &ps);
...
// BeginPaint 후 EndPaint 호출하지 않으면
// 무효화 영역이 계속 남아있게 되어
// WM_PAINT 메시지가 반복적으로 발생.
EndPaint(hWnd, &ps);
- Message Loop 방식에서 전환.
while (true)
{
// PeekMessage: 메시지 유무와 상관없이 바로 반환.
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
// 단축키 테이블 확인.
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// 메시지가 없는 동안 호출.
else
{
CCore::GetInstance()->progress();
}
}
이전의 PeekMessage 함수를 통해 기존의 메시지 큐에 메시지가 들어올 때까지 기다리는 방식에서
while 반복마다 동작하는 방식으로 변경.
게임에서는 변경점이 있든 없든 매 프레임마다 화면을 지우고 그리기를 반복하기 때문.
void CCore::progress()
{
update();
render();
}
void CCore::update()
{
// GetAsyncKeyState: 특정 키의 상태를 비동기적으로 확인.
// 0x8000 비트가 설정되어 있으면 해당 키가 현재 눌려져 있음을 의미.
if (GetAsyncKeyState(VK_LEFT) & 0x8000)
{
g_obj.m_ptPos.x -= 1;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
{
g_obj.m_ptPos.x += 1;
}
}
void CCore::render()
{
Rectangle(m_hDC,
g_obj.m_ptPos.x - g_obj.m_ptSize.x / 2,
g_obj.m_ptPos.y - g_obj.m_ptSize.y / 2,
g_obj.m_ptPos.x + g_obj.m_ptSize.x / 2,
g_obj.m_ptPos.y + g_obj.m_ptSize.y / 2);
}
Core::progress 함수 내부적으로는 update 함수를 통해 모든 변경사항을 계산한 뒤
render 함수에서 화면에 그려주는 동작을 수행함.
'Win32 api' 카테고리의 다른 글
| Win32 api 강의 11화. (0) | 2025.09.13 |
|---|---|
| Win32 api 강의 10화. (0) | 2025.09.12 |
| Win32 api 강의 8화. (0) | 2025.09.12 |
| Win32 api 강의 7화. (0) | 2025.09.11 |
| Win32 api 강의 6화. (0) | 2025.09.11 |