2008/06/13 16:34

Win32 API를 클래스화 했을때 프로시져 사용 방법


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 );
}

Trackback 0 Comment 0