Hola a todos, soy nuevo en el foro, buscando informacion sobre programacion grafica he llegado hasta aqui, a ver si podeis ayudarme.
Estoy empezando con opengl con los tutoriales de NEHE y aunque mis conocimeintos de C son básicos no tengo problemas para entender las lecciones de nehe.
El problema es que el codigo empieza a ser damasiado largo para un solo fichero.
Empiezo a buscar informacion sobre clases y una vez que creo tenerlo todo mas o menos claro empiezo a crear una clase con las funciones que gestionan la ventana de opengl.
He creado el fichero "nehewiondow.h" que queda asi.
#ifndef _NEHEWINDOW_H_
#define _NEHEWINDOW_H_
class nehewindow
{
private:
HDC hDC; // Private GDI Device Context
HGLRC hRC; // Permanent Rendering Context
HWND hWnd; // Holds Our Window Handle
HINSTANCE hInstance; // Holds The Instance Of The Application
bool keys[256]; // Array Used For The Keyboard Routine
bool active; // Window Active Flag Set To TRUE By Default
bool fullscreen; // Fullscreen Flag Set To Fullscreen Mode By Default
GLfloat LightAmbient[4];
GLfloat LightDiffuse[4];
GLfloat LightPosition[4];
public:
//contructor
nehewiondow(void);
// SetThings
void sethDC(HDC a);
void sethRC(HGLRC a);
void sethWnd(HWND a);
void sethInstance(HINSTANCE a);
void setkeys(unsigned int i, bool a);
void setactive(bool a);
void setfullscreen(bool a);
// GetThings
HDC gethDC(void);
HGLRC gethRC(void);
HWND gethWnd(void);
HINSTANCE gethInstance(void);
bool getkeys(unsigned int a);
bool getactive(void);
bool getfullscreen(void);
//
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
int InitGL(GLvoid);
GLvoid KillGLWindow(GLvoid) ;
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag);
};
#endif
y despues he ido copiando las funciones al fichero "nehewindow.cpp".
Todo iba bien hasta que llegue a (copio solo a cabecera y el lugar del error para no hacer demasiado largo esto)
BOOL nehewindow::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
.
.
.
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages
.
.
.
}
aqui me da el error
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
Esa misma linea en la funcion que esta en el fichero del main no da errores :-X.
He partido de la leccion 8 de nehe ( http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08 ) ahí esta todo el código, he copiado las funciones tal cual, si es necesario el resto del fichero "nehewindow.cpp" me lo decis aunque es un poco largo y como he dicho las funciones estan copiadas tal cual de la lecion 8 de nehe por lo que se supone que estan bien.
Gracias de antemano.
Tu problema es que la funcion WndProc es una funcion miembro y tu tienes que pasarle una funcion pura (estatica).
Windows nos permite attachar informacion del usuario a la ventana:
SetWindowLong(hWnd,GWL_USERDATA,(LONG)this);
(pon eso luego de creada la ventana en CreateGLWindow)
y luego agrega esta funcion a la clase:
En el h:
static LRESULT CALLBACK StdMsgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
En el cpp:
LRESULT CALLBACK nehewindow::StdMsgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
nehewindow *w = (nehewindow*)GetWindowLong(hwnd,GWL_USERDATA);
if(w) return w->WndProc( hwnd, Message, wParam, lParam);
return DefWindowProc(hwnd,Message,wParam,lParam);
}
Lo que estas haciendo ahi es una funcion by-pass, o bien un adaptador de una interface a lo que vos queres.
Suerte
PD: y obviamente usa: wc.lpfnWndProc = (WNDPROC) StdMsgProc;
Yuuuuupi :) soy feliz.
Muchas gracias, llevo varios dias intentando de diferentes formas apartar las funciones de gestion de ventana a un fichero independiente y entre que no tengo mucha idea de c++ y que no entiendo muy bien como funciona el visual studio me estaba empezando a desesperar con los errores.
La verdad no entiendo bien lo que me has dicho ni las funciones de gestion de ventana pero funciona, y lo mas importante he conseguido crear mi primera clase, aunque sea copiada me vale pare entender como funcionan, y ahora puedo centrarme en opengl y en ordenar mejor mis proyectos que es lo que quería.
Un saludo y gracias de nuevo.
Te aconsejo que te pases a usar los tutoriales de nehe pero con el código que usa
GLUT + OPENGL
así y de primeras, tienes un código portable entre windows y linux.
o liarte con SDL ?=)
Cita de: Buffon en 25 de Mayo de 2009, 12:44:52 PM
Te aconsejo que te pases a usar los tutoriales de nehe pero con el código que usa
GLUT + OPENGL
así y de primeras, tienes un código portable entre windows y linux.
o liarte con SDL ?=)
Aparte de la portabilidad ¿Cual es la diferencia? Es que tampoco tengo intención de programar bajo linux.
que es mucho más facil, legible y cómodo
No se, supongo que tenéis razón pero además también es mas pesado, es que mi intención es hacer una intro de 64k con música y para eso hay que eliminar todo lo que no sea imprescindible. Más adelante quizás, aunque tampoco tengo muchas aspiraciones, simplemente me entro la curiosidad por saber como iba esto de opengl.
Un saludo.
Está claro que cuando hablamos de demoscene hay que utilizar el mínimo de librerías extras posible, y a ser posible, utilizar sólo las dinámicas del sistema.