Hola a todos:<br><br>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:<br><br>//==========================================<br>
int WINAPI WinMain(...){<br>   CWin32Window w = CWin32Window();<br>   w.init();<br>   w.show();<br>   while(!w.finishApplication){<br>          w.processMessages();<br>   }<br>}<br><br>//==========================================<br>
<br>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:<br>
<br><br>//==========================================<br><pre class="code"><font size="2">LRESULT CALLBACK Window::MsgRouter(HWND hwnd, UINT message,<br>                                   WPARAM wparam, LPARAM lparam)<br>{<br>
  Window *wnd = 0;<br><br>  if(message == WM_NCCREATE)<br>  {<br>    // retrieve Window instance from window creation data and associate<br>    wnd = reinterpret_cast<Window *>((LPCREATESTRUCT)lparam)->lpCreateParams;<br>
    ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<long>(wnd));<br><br> // save window handle<br>    wnd->SetHWND(hwnd);<br>  }<br>  else<br>    // retrieve associated Window instance<br>    wnd = reinterpret_cast<Window *>(::GetWindowLong(hwnd, GWL_USERDATA));<br>
  <br>  // call the windows message handler<br>  wnd->WndProc(message, wparam, lparam);</font><br>}<br>//==========================================================================<br><br></pre>o asi:<br><br>//=========================================================<br>
<span name="intelliTxt" id="intelliTXT"><pre>LRESULT CALLBACK CBaseWindow::stWinMsgHandler(HWND hwnd, <br>                   UINT uMsg, WPARAM wParam, LPARAM lParam)<br>{<br>    CBaseWindow* pWnd;<br><br>    <span class="code-keyword">if</span> (uMsg == WM_NCCREATE)<br>
    {<br>        <span class="code-comment">//</span><span class="code-comment"> get the pointer to the window from<br></span><br>        <span class="code-comment">//</span><span class="code-comment"> lpCreateParams which was set in CreateWindow<br>
</span><br>        SetWindowLong(hwnd, GWL_USERDATA, <br>           (<span class="code-keyword">long</span>)((LPCREATESTRUCT(lParam))-<span class="code-keyword">></span>lpCreateParams));<br>    }<br><br>    <span class="code-comment">//</span><span class="code-comment"> get the pointer to the window<br>
</span><br>    pWnd = GetObjectFromWindow(hwnd);<br><br>    <span class="code-comment">//</span><span class="code-comment"> if we have the pointer, go to the message handler of the window<br></span><br>    <span class="code-comment">//</span><span class="code-comment"> else, use DefWindowProc<br>
</span><br>    <span class="code-keyword">if</span> (pWnd)<br>        <span class="code-keyword">return</span> pWnd-<span class="code-keyword">></span>WinMsgHandler(hwnd, uMsg, wParam, lParam);<br>    <span class="code-keyword">else</span><br>
        <span class="code-keyword">return</span> DefWindowProc(hwnd, uMsg, wParam, lParam);<br>}<br></pre></span>//===================================================<br><br>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.<br>
<br>Para resumir:<br>- Quiero una clase que encapsule una ventana de win32<br>- No se como hacer que el proceso de mensajes se haga dentro de la misma clase.<br><br>Me podeis ayudar?<br>Gracias<br>