Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: swapd0 en 26 de Febrero de 2007, 11:13:26 PM

Título: OpenGL dentro de un Control.
Publicado por: swapd0 en 26 de Febrero de 2007, 11:13:26 PM
Hola, ¿Alguien sabe como poder dibujar en OpenGL dentro de un control? No me vale en una ventana separada. Tiene que ser bajo Visual Studio 2005.

Yo tengo un control para dibujar en OpenGL usando las (supercutres) MFC dentro de un formulario. Ahora necesito hacer lo mismo pero bajo el Visual Studio 2005 sin usar las MFC, usando C++ "manejado", el problema es que en mi control necesito pasarle un CWnd*, y como esto es de las MFC pues no funciona.

He intentado con la propiedad Handle (convirtiendola a un ¿¿HWND?? porras no me acuerdo), pero no funciona porque necesito el CWnd.

Tambien me valdria, algo que pueda enganchar desde Visual Studio.
Título: OpenGL dentro de un Control.
Publicado por: shephiroth en 27 de Febrero de 2007, 01:18:03 AM
Buenas.

A ver, no se si funcionara pq este lo use en el visual 2002, y seguramente habran sacado cosas mejores, pero a ver si esto te sirve.

Si no estas usando MFC me imagino que estarás usando Windows.Forms. Los formularios tienen un metodo CreateGraphics que devuelve un objeto Graphics. Este objeto ya tiene metodos para poder dibujar lineas, texto y demas lindeces. A mi con eso me dio suficiente, pero acabo de ver que este objeto tiene un metodo GetHdc (Gets the handle to the device context associated with this Graphics).

Siento no poder darte nada mas concreto, pero espero que por lo menos te sirva como punto de partida ^^

SUERTE
Título: Re: OpenGL dentro de un Control.
Publicado por: MrK en 27 de Febrero de 2007, 12:04:50 PM
Seleccionas el contexto de openGL para dibujar con wglMakeCurrent?
Si es asi creo que lo que tienes que buscar es un HDC para tu ventana (y el HGLRC para
el openGL)
Título: OpenGL dentro de un Control.
Publicado por: Fran en 27 de Febrero de 2007, 12:06:33 PM
Es una lastima que no lo uses, xq desde Java si están dibujando dentro de controles Swing con OpenGL
Título: OpenGL dentro de un Control.
Publicado por: swapd0 en 27 de Febrero de 2007, 02:58:45 PM
Parece que se hace usando el GetHdc, pero debido a mi inutilidad con el C++ manejado no consigo echarlo andar... jo con lo facil que es hacer esto en el BeOS  :(
Título: OpenGL dentro de un Control.
Publicado por: MrK en 27 de Febrero de 2007, 05:52:13 PM
Cita de: "swapd0"Parece que se hace usando el GetHdc, pero debido a mi inutilidad con el C++ manejado no consigo echarlo andar... jo con lo facil que es hacer esto en el BeOS  :(

hombre, podrias poner algun codigo de ejemplo que quizas te podriamos ayudar mas :)

Por ejemplo (y asi a botepronto, que no puedo probar) con solo

HWND hWnd=::GetDlgItem (this->m_hWnd,IDC_GFX);
HDC hDC=::GetDC (hWnd);

deberia retornarte un hDC de un control llamado IDC_GFX (si, hay formas mas
elegantes de hacerlo). Con ese hDC tendrias que poder pintar una linia en GDI
(por ejemplo)
MoveToEx (hDC,1,1,NULL);
LineTo (hDC,100,100);

o hacer cualquier otra cosa con openGL, como seleccionar el contexto con
wglMakeCurrent
Título: OpenGL dentro de un Control.
Publicado por: swapd0 en 27 de Febrero de 2007, 11:25:13 PM
Es curioso pero me falla en el wglCreateContext, y los datos que le paso al setpixelformat son los mismos que en la clase de MFC...

PD: como odio programar para windows, mierda de Micro$oft que son incapaces de hacer algo facil de usar.
Título: OpenGL dentro de un Control.
Publicado por: MrK en 28 de Febrero de 2007, 11:44:58 AM
Cita de: "swapd0"Es curioso pero me falla en el wglCreateContext, y los datos que le paso al setpixelformat son los mismos que en la clase de MFC...

que te retorna GetLastError() ??

Citar
PD: como odio programar para windows, mierda de Micro$oft que son incapaces de hacer algo facil de usar.

tamos de acuerdo xD
Título: OpenGL dentro de un Control.
Publicado por: swapd0 en 01 de Marzo de 2007, 11:24:25 AM
Me da formato de pixel invalido (0x7d0), y el formato es el siguiente
static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
32, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)  
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
Título: OpenGL dentro de un Control.
Publicado por: MrK en 02 de Marzo de 2007, 09:10:40 AM
Pues no se, pero he hecho un ejemplito rapido basandome en el codigo base del
ejemplo 3 de nehe.gamedev.net y a mi me funciona :? ::

http://www.sharebigfile.com/file/98035/gltest-zip.html

(no tengas en cuenta las chapuzas y el codigo que no se usa, lo he hecho en
un momentillo en el curro xDD)
Título: OpenGL dentro de un Control.
Publicado por: swapd0 en 02 de Marzo de 2007, 12:26:32 PM
¡¡Tambien me funciona!! Ya me encargare de limpiar el codigo, muchas gracias MrK.