Win32 API를 클래스로 만들면서 메시지 프로시저의 사용법을 인터넷에서
찾아보면서 따라 해보고 고민을 했던 문제이다.
그러다가 몇 번의 시행착오를 거쳐서 사용법을 알게 됐다.
다른 건 같았는데 CreateWindow의 마지막 인자 this가 틀렸던 것이다.
마지막 인자에 this를 넣어주니 잘 돌아간다.
// 게임 애플리케이션으로 윈도우를 만든다
class CGameApp
{
public :
static LRESULT CALLBACK staticWndProc(
HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam );
protected :
LRESULT WndProc( HWND hWnd, UINT iMsg,
WPARAM wParam, LPARAM lParam );
};
// 윈도우 클래스를 정의, 등록, 생성을 하는 부분
BOOL CGameApp::Initialize( TCHAR* szTitle, HINSTANCE hInstance,
int nWidth, int nHeight, BOOL bWindowed )
{
// 생략
m_wc.lpfnWndProc = staticWndProc;
// 마지막 인자값에 this를 넣어준다.
m_hWnd = CreateWindow( m_szTitle,
m_szTitle,
m_bWindowed ? WS_MYSTYLE : WS_EX_TOPMOST,
WINDOW_START_X,
WINDOW_START_Y,
m_nScreen_Width,
m_nScreen_Height,
NULL,
NULL,
hInstance,
this );
}
// static으로 만들어둔 프로시져
// 실제 윈도우를 정의할때 사용하는 진짜 프로시져
LRESULT CALLBACK CGameApp::staticWndProc(HWND hWnd, UINT iMsg,
WPARAM wParam, LPARAM lParam)
{
CGameApp* pMainWindow;
// Get pointer to window
if( iMsg == WM_NCCREATE )
{
pMainWindow = (CGameApp*)((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG_PTR)pMainWindow );
}
else
{
pMainWindow = (CGameApp*)GetWindowLongPtr( hWnd, GWLP_USERDATA );
if( !pMainWindow )
return DefWindowProc( hWnd, iMsg, wParam, lParam );
}
pMainWindow->m_hWnd = hWnd;
return pMainWindow->WndProc( hWnd, iMsg, wParam, lParam );
}
// static 프로시져에서 이 프로시저로 메시지를 넘겨서 처리를 한다
LRESULT CGameApp::WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{
switch( iMsg )
{
case WM_CLOSE :
case WM_QUIT :
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( m_hWnd, iMsg, wParam, lParam );
}

Prev

Rss Feed