he creado una clase con varios métodos para facilitar el arduo trabajo de crear un simple ventana. el constructor copia recibe la clase por ref. y la inicializa y registra, otro método hace lo de CreateWindow, pásandole todas las variabes q necesita, y el 3º muestra la ventana simplemente. tengo la clase en un header q me he creado y va todo bien, (todos los errores leves ya corregidos :P) pero al llegar al método de createwindow, me da este error al compilar: (he quitado las rutas de los archivos para no abultar)
error C2039: 'crear_ventana' : is not a member of 'tagWNDCLASSA'
c:archivos de programamicrosoft visual studiovc98includewinuser.h(1184) : see declaration of 'tagWNDCLASSA'
Error executing cl.exe.
es lo único q me falla, pero es q ni mirando el archivo este y la estructura q viene, sé como solucionarlo. :enfadado: :enfadado:
venga gracias
Pastea el código fuente completo o pon un link a el, si no, me parece que poco podemos (puedo :oops: ) hacer.
De todas maneras... he creido que tienes definida e implementada la clase en un archivo de cabecera (¿Es así?). No es una buena idea hacer implementaciones de clase en un .h :enfadado:
Por otra parte, suena como si la declaración de la clase no coincidiera con la implementación. Repasa bién el código fuente. :ojo:
aqui pongo la web al codigo, el enlace esta nada más entrar. no es directo pq lycos no deja enlaces directos :enfadado:
http://usuarios.lycos.es/theprofessional/no es muy largo ni el .cpp ni el .h con la clase
como q no es bueno poner clases, yo creo haberlo visto en algunos sitios. pq no es bueno? entonces donde debería ponerlas, en un .cpp normal enlazado??
venga gracias
Hombre, no he mirado nada porque tampoco tengo mucho tiempo, pero el error parece que sea que intentas llamar a un método crear_ventana() que no existe en la clase tagWNDCLASSA ^_^'
sync
la estructura 'tagWNDCLASSA' es del compilador, me refiero q yo no la he hecho, y por supuesto mi método no viene en ella. me la miré pero no sé en q puede afectar a mi programa :llorando:
thx
Imagino que lo que quieres hacer es esto:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprevinstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASS clasewnd;
ventana ventana1(clasewnd, "clase1", hInstance); //Se inicializa y registra la clase
clasewnd.lpfnWndProc = WindowProcedure;
HWND hWnd;
MSG msg;
ventana1.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480, hInstance);
while(GetMessage(&msg, 0, 0, 0) == TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
Tu habias puesto:
clasewnd.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480, hInstance);
De todas formas siguen saliendo errores, como un destructor sin implementar, etc...
Yo no te puedo ayudar ahora mismo, ya que siempre utilizo las MFC y en estas cosillas estoy oxidado...
un saludo
Fiero tiene razón.
WNDCLASS clasewnd;
...
hWnd = clasewnd.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480);
No es correcto. Cambia clasewnd por ventana1, tal y como te ha dicho Fiero.
Fallos que he visto:
:!: 1.- crear_ventana no devuelve nada, así que la linea
hWnd = ventana1.crear_ventana(hWnd, "Ventanita preDirectX9", 640, 480);
No tiene sentido.
:!: 2.- En la declaración de la clase, el método crear_ventana tiene la siguiente declaración
crear_ventana(HWND &hwnd, char * title, int ancho, int alto, HINSTANCE hInstance);
Mientras que en main.cpp lo llamas sin pasarle hInstance.
:!: 3.- No tienes el destructor implementado y si declarado
:!: 4.- Vale que el contructor no tenga tipo, pero los demás métodos como mínimo tendrías que declararlos como void
Pero en definitiva, son fallos leves ;-)
En cuanto al tema de dejar la implementación de las clases en archivos de cabecera, para mi es un tema de limpieza (Cada cosa a su sitio: codigo a los .cpp y declaraciones a los .h :D), a parte de que, una vez compilado el cpp con las clases que ya están bién, ya no se vuelve a compilar, con la consiguiente reducción del tiempo de compilación 8). Si la clase está en un fichero de cabecera, se tiene que compilar cada vez que modifiques algo, ya no de la clase, sino del fichero donde tengas incluido el .h (si no tienes un compilador incremental :loco: ).
Ale, a corregir...
Saludotes
vale gracias a los dos, era el pequeño detalle ese, joe pq tonteria.
bueno el caso es q compilo y no da errores pero claro no podia ser todo tan bonito asi q me pone unhandled exception y se me pira al debugger y en ASM encima, asi q ni idea.
estaba poniendo lo q me decia HgH de el codigo al cpp y declaraciones al .h y bueno, he puesto lo q es la definición de la clase y todo el mazacote en otro cpp q no es el principal, pero no sé como enlazarlo pq no me lo coge.
le puse en el .h: #include "ZNwin2.cpp" pero no lo pilla, como se incluyen los cpp? no poniendo nada de enlazar el cpp, tampoco va
como lo hago?, gracias
No incluyas los .cpp, sólo los .h de esos .cpp (creo, no me hagas mucho caso que acabo de cenar lentejas).
Como dice Mars Attacks (a pesar de haberse fartado a lentejas como un gorrinillo sudoroso©), son los .h los que se deben incluir en los .cpp
En el .h:
// MiClase.h
#pragma once
class MiClase
{
public:
MiClase();
~MiClase();
//definiciones de miembros y métodos públicos
private:
//definiciones de miembros y métodos privados
};
//Fin de MiClase.h
y en el cpp
//MiClase.cpp
#include "MiClase.h"
MiClase::MiClase()
{
}
MiClase::~MiClase()
{
}
...
//coding,coding,coding
//Fin de MiClase.cpp
Teniendo estos dos ficheros incluidos en el proyecto (te estoy hablando de Visual C. En otros entornos, no debe de diferir demasiado), puedes usar la clase en cualquiera de los otros .cpp que tengas incluidos en el proyecto, siempre que incluyas en ellos el .h
#include "MiClase.h"
void HazAlgo()
{
MiClase InstanciaDeMiClase;
.....
}
Realmente los compiladores de C te dejan hacer muchas guarrerías (como incluir en un cpp otro cpp y esas cosas), pero yo pienso que es mejor estructurarlos un poco y no enguarrar mucho el código, sino después no hay quien lea el código).
Bueno, espero que te haya aclarado algo...
Cuentanos que tal :)
Saludotes
reholas, he arreglado el codigo con todo lo q me habeis dicho, y ya está en sus respectivos archivos cada cosa; el problema ahora :enfadado: es q me da error al ejecutarse; exception unhandled.
repongo la web con el código. plz es lo ultimo q me falla y esto ya si q he probado de todo y no se q puede pasar:
http://usuarios.lycos.es/theprofessional/ gracias x 5 :D
Por supuesto que te da Access Violation, tu WndClass.lpfnWndProc no está inicializado :o
Sólo con que descomentes la línea WndClass.lpfnWndProc = WindowProcedure ya no se te colgara. No te ilusiones, te advierto que tampoco se te verá la ventana... cuidadín no vayas a crear un montón de procesos :ojo:
Por otro lado, como ya se ha dicho, cuando te acostumbras a las MFCs no son tan malas, creo que estás currando inútilmente :I
sync
lo de q no se muestra la ventana ya lo sabía; es pq falta poner el método mostrar_ventana. ya me funciona y ya se me ve la ventanita. gracias a todos, q aunq una ventanita chorra, al menos me sale lo q quería.
por cierto alguien me decía q faltaba definir el destructor de la clase; pero q hay q poner dentro? yo es q he visto q con poner el destructor declarado, ya vale, se destruye y todo eso, vamos q no lleva más código q: ~miclase() {} ;
si no es así, decidme q hay q poner, q a lo mejor estoy cagandola en lo q haga.
volviendo a la ventanita, q luego no vale para nada, pues :( pero al menos he conseguido q rule.
por cierto, pq dices q no vale para nada? y ya de paso, me podeis explicar q es lo de las MFC?? pq lo vi en la ayuda del VC++6 pero vamos q me quede con q eran un conjunto de librerias, pero nada más. así q sigo aquí algo ignorante :-?
En el destructor deberías liberar toda la memoria asignada dinámicamente, aunque ahora no me acuerdo creo que no tenías nada dinámico. Por otro lado, si no declaras el destructor o lo declaras sin contenido, el C++ te crea un destructor por defecto que básicamente libera la memoria reservada para el objeto.
Las MFCs son un conjunto de clases proporcionadas por Microsoft para trabajar con ventanas. Junto con las MFCs y el ClassWizard del VC++ puedes currarte unos diálogos y formularios igual que como lo harías más o menos en Visual Basic o en Borland Builder, sólo que es un poco más complicado. Pero por lo menos te permite dibujar la ventanita y te genera el solito gran parte del código que necesitas para gestionar los componentes, y así te ahorras de hacer eso que estás haciendo. Si vas a dedicarte a hacer aplicaciones de ventanas con VC++ deberías conocer las MFCs. Para un videojuego, que en general no necesita ventanas, no te hace tanta falta.
Y lo que has hecho, inútil tampoco es hombre, por lo menos has conseguido que funcione, eso siempre recompensa :D
sync
vale, claro lo del destructor. si me imaginaba q era para liberar la memoria dinámica, pero no tengo nada asi, asi q nada. otra cosa a tachar de la lista de dudas. thx
ah, asi q lo de las MFC es lo de q vas y te creas a golpe de raton las ventanitas. vamos lo de la barra esa de objetos, q te deja crear un boton, un dialogo , etc. q solo tienes luego q poner los comandos q recibe la ventana en el código. eso si lo he visto un poco, pero era más q nada por ver q al menos me sale esto. y otra duda menos :D thx
de todas formas como decía el titulillo de la ventana q he hecho, estoy empezando con el DX así q de aplicaciones de ventanitas poco. vamos q se ejecute en ventana en vez de pantalla completa a lo mejor, pero vamos q se me entiende :P