una tortuga tecnunlogo sirve rectangulo que poligono para libreria hacer glfrustum dibujar coordenadas como animacion winapi opengl windows-8 windows-7 modal-dialog

winapi - tortuga - rectangulo opengl



Los diálogos modales abiertos por una ventana OpenGL a pantalla completa en Windows 7 no se muestran (4)

La solución en mi sistema era bastante simple: - NO especifique el estilo WS_POPUP en el momento de creación de la ventana. - Justo después de obtener hwnd, restablezca sus estilos de Windows a lo que desee (pero no WS_POPUP nuevamente) usando SetWindowLong (hwnd, GWL_STYLE, yr_styles);

Parece que mi problema puede ser el mismo que el de una pregunta relacionada no respondida ( OpenGL con GLUT en Windows 7, modo de pantalla completa que no muestra el cuadro de mensaje ).

Desde que cambié a Win7 como entorno de desarrollo y una posible plataforma de destino para mis aplicaciones, noté una regresión en su comportamiento.

Cada vez que tengo una ventana de pantalla completa que contiene un contexto de OpenGL a pantalla completa, las aplicaciones tienen problemas para mostrar cuadros de diálogo modales (como cuadros de mensaje, diálogo de abrir archivo, etc.)

La ventana acaba de crearse con el estilo WS_POPUP. El contexto GL no es nada sofisticado. Y todo está bien con Windows XP.

El problema en Windows 7 es que los cuadros de diálogo modales son invisibles en su apertura (tal vez aparecen detrás de la ventana de pantalla completa). Tienes que Alt-Tab la aplicación para que aparezcan los cuadros de diálogo.

Este es un problema importante ya que la aplicación parece estar congelada, mientras que de hecho espera la entrada del usuario.

¿Alguien encontró este comportamiento? Alguien sabe una solución ?

Rápidamente hice una prueba de aplicación de prueba; su código fuente se puede encontrar en http://pastebin.com/K4v2NNDs . Un simple proyecto MSVC8 se puede encontrar aquí .

PD. También publiqué en los foros de opengl.org, lo siento por aquellos de ustedes que siguen ambos.

EDITAR

Gracias a Chris, he probado el diálogo modal en varios eventos, como WM_TIMER o WM_RBUTTONUP, pero el problema sigue ahí.

También llamé ''DwmEnableComposition'' con ''DWM_EC_DISABLECOMPOSITION'' solo para verificar: el problema sigue ahí.

También probé la aplicación reemplazando los bits OpenGL por DirectX, y de esta manera todo funciona como se esperaba ... Realmente es OpenGL el que causa el problema.

(actualizado pastebin http://pastebin.com/Rq1Ehm3w y mi scratchpad)

EDITAR

El problema también existe en Windows 8.


Tuve el mismo problema con OpenGL en Win7 64 bit. Los cuadros de diálogo modales y las ventanas modales no se muestran, también están activos en segundo plano. Mi proyecto usó visualización estéreo (buffers cuádruples). En mi caso, el problema se debió a una configuración incorrecta en el panel de control del adaptador de pantalla (Nvidia Quadro FX3800). La configuración era "Stereo Enabled", que estaba incorrectamente en "off". Activarlo resolvió el problema.


Joseph Steel ha publicado una solución en opengl.org , así que, como referencia, también la puse aquí:

La solución que encontré para este problema fue garantizar que el formato de píxel de la ventana utiliza el método de intercambio WGL_SWAP_COPY_ARB en lugar del WGL_SWAP_EXCHANGE_ARB.

Noté que uno debe usar ''wglChoosePixelFormatARB'' para obtener el formato de píxel.

Intenté con el clásico ''ChoosePixelFormat'' con el indicador ''PFD_SWAP_COPY'', pero no funciona en mi sistema (Win7 x64 + NVidia GeFo 9600GT v196.21) ya que siempre me devuelve un formato de píxel con ''PFD_SWAP_EXCHANGE'' en su lugar.

Estoy medio contento con los resultados, ya que introduce algo de desgarro en mi pantalla, ¡pero al menos funciona!

Como referencia, he actualizado mi código fuente de prueba .

EDITAR, dec.2013

Esta solución ya no funciona, al menos en mi sistema (computadora portátil, Optimus GeForce 650M). El WGL_SWAP_COPY_ARB está configurado, pero el diálogo modal no se muestra. Hasta ahora, parece que la creación de la ventana con un borde de 1 píxel (que agrega WS_BORDER al estilo WS_POPUP) hace el truco, y evita el ingreso al modo ''pantalla completa''.


cuando quiero, por ejemplo, abrir un archivo de diálogo en OpenGL de pantalla completa (Windows10 o todos los Windows anteriores), llamo

RedrawWindow (hwnd, 0, 0, RDW_INTERNALPAINT);

(Esto provoca que se publique un mensaje WM_PAINT en la ventana independientemente de si alguna parte de la ventana no es válida)

y justo después de esto llamo al archivo de diálogo. El archivo de diálogo se mostrará ahora en la pantalla completa de OpenGL.

En WndProc dentro del caso WM_PAINT: hago un SwapBuffers (hdc)

RedrawWindow(hwnd, 0, 0, RDW_INTERNALPAINT); // important when fullscreen; forces a WM_PAINT message, GLwin->Fileselect(s_fname); // or whatever dialog LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lparam) { switch(message) { case WM_PAINT: SwapBuffers(hdc); // (same as in the render-loop) break;