[C con Clase] Win32 en una clase

Ferran Ferri ferranferri en gmail.com
Mie Mar 19 10:19:37 CET 2008


Hola a todos:

estoy intentanto hacer una clase que encapsule el codgo necesario para abrir
una ventana con win32 API. La idea es que el codigo del main quede algo asi:

//==========================================
int WINAPI WinMain(...){
   CWin32Window w = CWin32Window();
   w.init();
   w.show();
   while(!w.finishApplication){
          w.processMessages();
   }
}

//==========================================

El problema con el que me encuentro es con el wndproc (el proceso de los
mensajes). No parece que sirva con simplemente crear un metodo en la clase y
darselo a wndclassex. He mirado por algunas paginas y lo solucionan asi:


//==========================================

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

o asi:

//=========================================================

LRESULT CALLBACK CBaseWindow::stWinMsgHandler(HWND hwnd,
                   UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    CBaseWindow* pWnd;

    if (uMsg == WM_NCCREATE)
    {
        // get the pointer to the window from

        // lpCreateParams which was set in CreateWindow

        SetWindowLong(hwnd, GWL_USERDATA,
           (long)((LPCREATESTRUCT(lParam))->lpCreateParams));
    }

    // get the pointer to the window

    pWnd = GetObjectFromWindow(hwnd);

    // if we have the pointer, go to the message handler of the window

    // else, use DefWindowProc

    if (pWnd)
        return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam);
    else
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

//===================================================

Estos metodos siempre se declaran como static dentro de la clase. Ambos se
parecen y creo entender que redireccionan el puntero a funcion que se llama
para proceso de mensages. Pero la verdad es que no se muy bien como
funciona.

Para resumir:
- Quiero una clase que encapsule una ventana de win32
- No se como hacer que el proceso de mensajes se haga dentro de la misma
clase.

Me podeis ayudar?
Gracias
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080319/5f36ef82/attachment.html>


Más información sobre la lista de distribución Cconclase