2010-05-29 4 views
2

Je tente d'apprendre à créer des fenêtres en C++, j'ai regardé un article sur la création d'une classe wrapper mais je ne le comprends pas vraiment. Jusqu'à présent, je sais que vous ne pouvez pas avoir une méthode de classe WndProc (je ne sais pas pourquoi) mais honnêtement, c'est tout. Quelqu'un peut-il donner une explication, expliquant aussi le reinterpret_cast? Here est l'article.Window Wrapper Classe 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); 
} 

Merci d'avance, ell.

Répondre

4

La procédure MsgRouter() agit comme un proxy entre le système de messagerie de Windows et l'instance Window associée à HWND. Il achemine les messages Windows vers des objets C++.

Un pointeur vers l'instance Window est transmis à la procédure MsgRouter() via le dernier paramètre de la fonction CreateWindow(). Lorsque vous créez d'abord un HWND via CreateWindow() (ou CreateWindowEx()), certains messages sont envoyés, l'un d'entre eux étant WM_NCCREATE. Lorsque la procédure reçoit un message WM_NCCREATE, le paramètre LPARAM contient un pointeur vers un CREATESTRUCT qui contient les arguments qui ont été transmis à la fonction CreateWindow(). La procédure récupère le pointeur d'instance Window à partir du CREATESTRUCT et l'enregistre dans le HWND en le définissant comme attribut du HWND (GWL_USERDATA via SetWindowLong()).

Maintenant que le pointeur a été enregistrée, la procédure de fenêtre peut désormais récupérer un pointeur vers l'instance Window d'origine d'un HWND via GetWindowLong() lorsqu'il reçoit un message. Enfin, la procédure de fenêtre appelle WndProc() sur le pointeur Window récupéré, en transmettant le message et les paramètres exacts, afin que l'instance Window puisse gérer le message.