Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Messageprocedure En Una Clase

Iniciado por Sergio, 22 de Febrero de 2004, 05:24:10 PM

« anterior - próximo »

Sergio

 Bueno, he dejado los engines ya hechos de lado para "volver a empezar". De modo que estoy haciendo una clase para mi aplicacion (antes lo hacia sin clase [sin clase de C++ y sin clase de la otra xDD], a pelo con las funciones desperdigadas) y hago esto.
La funcion WinMain suelta, y en esta creo un objeto de la clase de mi aplicacion, entonces quiero que el manejador de mensajes sea una funcion de miembro de la clase (se llamaban metodos, no? xD).
Entonces, yo en WinMain llamo a la funcion de mi clase que se llama Iniciar, y este crea la clase de ventana, la registra, etc. Cuando relleno los campos de la WNDCLASSEX, el campo de la funcion MsgProc, le paso la funcion de miembro que he programado para ello y el compilador me da error:
error C2440: '=' : cannot convert from 'long (__stdcall MiAplicacion::*)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long (__stdcall *)(s
truct HWND__ *,unsigned int,unsigned int,long)'
Vamos, que el principal problema es que esta funcion viene de una clase que yo he creado, y no se... no es compatible o algo asi...
No hay forma de hacer esto que quiero hacer? Como lo haceis vosotros??  
here are only 10 types of people: those who understand binary and those who don't

ethernet

 Es el tipico caso que espera puntero a funcion y le pasas puntero a metodo. Si te paras a pensar un poco te daras cuenta de que pasandole un metodo seria factible llamarlo como una funcion normal pero has pensado sobre que instancia ejecutaria ese metodo?
La solucion es poner ese metodo static. Dentro de ese metodo debes mapeando los hwnd a punteros a tu clase Window de manera que obtienes el puntero a la clase con el hwnd que te pasa el windoproc.
La verdad es que me he explicado de lastima XD pero en gamedev he encontrado esto :

http://www.gamedev.net/community/forums/to...?topic_id=59171


saludos


Sergio

  :ph34r:  :ph34r:  :ph34r:
tengo miedo... xDD
Todavia no he probado a ponerlo, primero estoy intentando entender que coño hace eso xD
Gracias por la ayuda!
Un saludo!
here are only 10 types of people: those who understand binary and those who don't

Sergio

 Oye... que es eso de mapear?? Porque en graficos y eso se a que se refiere, pero aqui.. xDD
here are only 10 types of people: those who understand binary and those who don't

ethernet

 Mira el codigo del foro.

Con mapear me refiero a hacer

std::map mapper;

de tal forma que cuando llame al wndproc static puedas hacer:

Window *w = mapper[hWnd];
w->wndproc(params); // metodo virtual de window que debes overridear en las impoementaciones derivadas

eso si, tienes q tener en cuenta que al crear una ventana tienes que registrar ese hwnd al window*, por ejemplo

//en el metodo create de la ventana p.ej window::create
hwnd =  CreateWindow(....);
if(IsVaid(hndw)) mapper[hwnd] = this;

Por ultimo mapper debe ser un miebro static de la clase aunque a mi me resulta cutre poner una variable en una clase que tienes todos los metodos virtuales (como es mi implementacion de window)

saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.