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>