2010-05-29 3 views
2

C++로 창을 만드는 법을 배우려하고 있는데 래퍼 클래스를 만드는 방법에 대한 기사를 보았지만 실제로 이해하지는 못합니다. 지금까지 나는 당신이 클래스 메소드 WndProc을 가질 수 없다는 것을 안다. (나는 왜 그런지 모른다.) 솔직히 말해서, 그것은 모두 다. 누군가 reinterpret_cast를 설명하면서 설명을 해줄 수 있습니까? Here이 기사입니다.Window Wrapper 클래스 C++ (G ++)

LRESULT CALLBACK Window::MsgRouter(HWND hwnd, UINT message, 
            WPARAM wparam, LPARAM lparam) 
{ 
    Window *wnd = 0; 

    if(message == WM_NCCREATE) 
    { 
    // retrieve Window instance from window creation data and associate 
    wnd = reinterpret_cast<Window *>((LPCREATESTRUCT)lparam)->lpCreateParams; 
    ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<long>(wnd)); 

    // save window handle 
    wnd->SetHWND(hwnd); 
    } 
    else 
    // retrieve associated Window instance 
    wnd = reinterpret_cast<Window *>(::GetWindowLong(hwnd, GWL_USERDATA)); 

    // call the windows message handler 
    wnd->WndProc(message, wparam, lparam); 
} 

미리 감사드립니다.

답변

4

MsgRouter() 절차는 HWND과 연결된 Window 인스턴스에 대한 Windows 메시지 처리 시스템 간의 프록시 역할을합니다. Windows 메시지를 C++ 개체로 라우팅합니다.

Window 인스턴스에 대한 포인터는 CreateWindow() 함수의 마지막 매개 변수를 통해 MsgRouter() 프로 시저로 전달됩니다. CreateWindow() (또는 CreateWindowEx())을 통해 HWND을 처음 만들면 일부 메시지가 전송됩니다. 그 중 하나는 WM_NCCREATE입니다. 프로 시저가 WM_NCCREATE 메시지를 수신하면 LPARAM 매개 변수는 CreateWindow() 함수에 전달 된 인수를 포함하는 CREATESTRUCT에 대한 포인터를 포함합니다. 이 프로시 저는 CREATESTRUCT에서 Window 인스턴스 포인터를 검색하여 HWND (GWL_USERDATA을 통해 SetWindowLong())의 특성으로 설정하여 HWND에 저장합니다.

이제 포인터가 저장되었으므로 메시지를받을 때 창 프로 시저에서 원래 Window 인스턴스의 포인터를 HWND에서 GetWindowLong()을 통해 가져올 수 있습니다. 마지막으로 창 프로시 저는 검색된 Window 포인터에서 WndProc()을 호출하여 정확한 메시지와 매개 변수를 전달하므로 Window 인스턴스가 메시지를 처리 ​​할 수 ​​있습니다.