[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