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???
Prueba con:
wc.lpfnWndProc = WndProc;
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.
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...
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.
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.
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?
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 :-?
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?
Sí, no me gusta nada esa forma.
No se cómo trabaja SDL. No la he usado. ¿No es codigo libre?
Haberlas hailas.