Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con la clase WNDCLASS

Iniciado por Ogl2k, 07 de Octubre de 2002, 10:19:18 AM

« anterior - próximo »

Ogl2k

                                Tengo un problema al asignar las propiedades de la clase WNDCLASS dentro de un clase propia que estoy haciendo para manejar una ventana.

El error lo da en esta linea de codigo:

wc.lpfnWndProc   = (WNDPROC)WndProc;

cWnd32.cpp(102) : error C2440: 'type cast' : cannot convert from '' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'

None of the functions with this name in scope match the target type.


La funcion WndProc esta definida como:

LRESULT CALLBACK cWnd32::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

Alguna idea???                                

sés

                                Prueba con:

wc.lpfnWndProc = WndProc;                                
Soy indeciso... ¿o no?

ProD

                                Bueno creo que tu problema es que para usar un procedimiento de ventana en una clase este tiene que ser "static" con lo que obligas a su vez a que la clase también sea "static", espero haberte solucionado el problema, chao.                                
as ideas son capitales que sólo ganan intereses entre las manos del talento


Loover

                                He probado la forma de Juan Mellado y me va perfectamente. Gracias!

Pero ahora me ha surgido una duda.
El caso es que anteayer me puse a hacer una dll. Lo primero que le he metido es la posibilidad de crear una ventana (de la forma esa) y funciona correctamente... el unico problema es este:
Utilizo la función de la libreria (LibreriaLoover.dll) que he creado llamada "DibujarVentana", pero como esta tiene el típico bucle para gestionar los mensajes "(while (msg.message != WM_QUIT)" que se ejecuta continuamente, se queda ahí pillado, y no sigue el código hasta que cierro la ventana. Es decir:

#Include "LibreriaLoover.h"

DibujarVentana ();
............ AQUI SE QUEDA PILLADO HASTA QUE CIERRO LA VENTANA ............

DibujarTriangulo ();
Etc

Para cuando dibujo el triángulo, ya no hay ventana  :o, pq se queda pillado en el bucle de la libreria, del cual salgo cuando cierro la ventana.

¿Cómo se hace para que la ventana que crea la libreria se quede y pueda seguir con lo que viene despues? ¿De que forma debo gestionar los mensajes?
No se si ha quedado clara cuál es mi duda...                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                               

while( Msg.message != WM_QUIT )

{

Message = PeekMessage( &Msg, NULL, 0U, 0U, PM_REMOVE );



if( Message )

{

 TranslateMessage(&Msg);

 DispatchMessage(&Msg);

}

else

{

 m_pRender->Render();

}

}



Como ves, el secreto está en llamar al Render (y todo lo demás que tengas que ejecutar) dentro del bucle de mensajes. Si no hay mensajes en la cola de mensajes, se ejecuta el Render.

Cuando sales del bucle es para finalizar el programa.

Saludos.                                
Drowning deep in my sea of loathing

Loover

                                No, eso ya lo sé. Asé es como lo hacia antes de meter la funcion en la dll. Pero ahora que voy a usarla, no puedo tener ahi el render, ni nada de eso. No puedo tener ahi el bucle principal porque este estara en el codigo que llama a la dll, donde el usuario quiera.
Relee el post anterior, y si no me explico bien, intentare reescribirlo con mas ejemplos.                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Loover

                                Mirar esto:



#include "Main.h"

#include "Loover.h"



int WINAPI WinMain( HINSTANCE hInstance,   // Instancia

    HINSTANCE hPrevInstance,  // Instancia anterior

    LPSTR  lpCmdLine,   // Parámetros de la linea de

            // comandos

    int   nCmdShow)   // Estado ventana

{



Loover_CrearVentana ();



MSG msg;

while (msg.message != WM_QUIT)

{

 if (PeekMessage (&msg, 0, 0, 0, PM_REMOVE))

 {

  TranslateMessage(&msg);

  DispatchMessage(&msg);

 }

 else

 {

  // Aquí, el tema (*)

 }

}  

return 0;

}



Loover_CrearVentana  esta en la libreria Loover.dll. Pero también me gustaría que la gestión de los mensajes estuviera allí... sinembargo, al estar allí el bucle principal (*) se quedaría alli atascado.

Me gustaría poder hacer algo así:



#include "Main.h"

#include "Loover.h"



int WINAPI WinMain( HINSTANCE hInstance,   // Instancia

    HINSTANCE hPrevInstance,  // Instancia anterior

    LPSTR  lpCmdLine,   // Parámetros de la linea de

            // comandos

    int   nCmdShow)   // Estado ventana

{



Loover_CrearVentana ();



               // La ventana se crea y el flujo del programa continua por aqui



               While (!PulseUnaTecla) DibujarLoQueSea ();



return 0;

}



¿Me explico?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                Llama en cada iteración del bucle principal de tu aplicación a una función de la dll que gestione los mensajes.



#include "Main.h"

#include "Loover.h"



int WINAPI WinMain(   HINSTANCE   hInstance,         // Instancia

              HINSTANCE   hPrevInstance,      // Instancia anterior

              LPSTR      lpCmdLine,         // Parámetros de la linea de

                                      // comandos

              int         nCmdShow)         // Estado ventana

{



  Loover_CrearVentana ();



               // La ventana se crea y el flujo del programa continua por aqui



               While (!PulseUnaTecla)

               {

                               DLLGestionaMensajes();

                               DibujarLoQueSea ();

               }

  return 0;

}



Puedes probar algo así, pero no lo veo muy claro  :-?                                
Drowning deep in my sea of loathing

Loover

                                Si, he pensado en eso. Incluso lo he hecho ya. Pero es realmente cutre, ¿no crees? Si SDL no necesita eso... ¿porqué lo necesito yo?
¿No hay mas soluciones?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                Sí, no me gusta nada esa forma.

No se cómo trabaja SDL. No la he usado. ¿No es codigo libre?

Haberlas hailas.                                
Drowning deep in my sea of loathing






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.