Pregunta

Tenemos algunas aplicaciones internas integradas en MFC, con rutinas de dibujo OpenGL.Todos usan el mismo código para dibujar en la pantalla e imprimir la pantalla o guardarla en un archivo JPEG.Todo ha estado funcionando bien en Windows XP y necesito encontrar una manera de hacerlos funcionar en Vista.

En tres de nuestras aplicaciones, todo funciona.En el restante, puedo obtener el borde de la ventana, la barra de título, los menús y la barra de tareas, pero el interior nunca aparece.Como dije, estas aplicaciones usan exactamente el mismo código para escribir en la pantalla y capturar la imagen de la ventana, y la única diferencia que veo que parece relevante es que la aplicación problemática usa la interfaz de múltiples documentos MFC, mientras que las que funcionan utilizan la interfaz de documento único.

O la respuesta no está en la red, o busco en Google peor de lo que pensaba.Pregunté en los foros de MSDN y la única sugerencia práctica que recibí fue usar GDI+ en lugar de GDI, y eso no hizo nada diferente.He probado cosas diferentes con cada parte del código que captura, imprime o guarda, dándole un puntero a la ventana, por lo que aparentemente es una cuestión de la ventana misma.Todavía no he reconstruido la aplicación infractora usando SDI y realmente no tengo otras ideas.

¿Alguien ha visto algo como esto?


Lo que tengo son cuatro aplicaciones.Usan mucho código común y comparten los archivos .h y .cpp reales, por lo que sé que el código de dibujo y captura de pantalla es idéntico.

Hay una rutina WindowtoDIB() que toma un *pWnd, un rectángulo de origen y un tamaño de destino.Parece un código de Microsoft ligeramente adaptado y encontré otras funciones en este archivo en el sitio web de Microsoft.De mis cuatro aplicaciones, tres manejan esto bien, pero una no.La diferencia más obvia es que el problema es el MDI.

Me parece que el *pWnd es el problema.No soy un gurú de MFC ni mucho menos, y me parece que el problema puede ser que tenemos una ventana configurada en las SDI y más de una en la MDI.Es posible que esté pasando el *pWnd incorrecto a la función.

Mientras tanto, ha empezado a funcionar correctamente en la máquina de prueba Vista de 64 bits, aunque todavía no funciona en la máquina Vista de 32 bits.No tengo ni idea de porqué.No he cambiado nada desde las últimas pruebas y no creo que nadie más lo haya hecho.(En la versión de 32 bits, la tecla Imprimir pantalla funciona como se esperaba, pero no guarda la pantalla como JPEG).

¿Fue útil?

Solución 5

Finalmente resolvimos esto creando un contexto OpenGL diferente y dibujando todo en él.Nos dimos por vencidos con la captura de pantalla.

Otros consejos

El título de su pregunta menciona la captura de pantalla, pero su pregunta real no.Por favor explíquelo más claramente.¿El problema es que puedes hacer capturas de pantalla de tres de tus aplicaciones, pero no de la cuarta?Puede utilizar diferentes programas de captura de pantalla que puedan capturar ventanas OpenGL/DirectX.Esas superficies son manejadas directamente por el Administrador de ventanas y no aparecerán con un simple 'PrtScn'.

Cambiar a GDI+ no lo solucionará, ni tampoco cambiar a SDI.

Si lo que desea es el contenido del CView, entonces sí, ese debería ser el correcto.Si es el contenido de toda la pantalla (al menos el contenido, sin las barras de herramientas ni la barra de estado), entonces debes pasarle CMainFrame (ese es el nombre predeterminado que puede haber sido cambiado, el que se deriva de CMDIFrameWnd ).

¿Puedes publicar el código de WindowToDIB()?Lo acabo de probar y funciona para mí (TM), pero sin el código OpenGL en la vista.Intente pasar las siguientes ventanas a su función WindowToDIB():

Marco principal* mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

y mira lo que obtienes.

El contenido de cada ventana son superficies DirectX y solo los ensambla el administrador de ventanas en la tarjeta gráfica.No podrá capturar esto a menos que desactive la nueva interfaz (DWM) o codifique específicamente para la captura de pantalla desde DWM.

Wikipedia tiene una buena descripción del Administrador de ventanas de escritorio (DWM)

Lo siento, todavía no entiendo.¿Estás intentando que la tecla Imprimir pantalla funcione en las cuatro aplicaciones?¿O está intentando que funcione la función WindowtoDIB(), que toma una 'captura de pantalla' (desde su propia aplicación) de la aplicación misma, para poder guardarla como un archivo de imagen?

Además, ¿qué quieres decir con "la tecla Imprimir pantalla funciona como se esperaba, pero no guarda la pantalla como JPEG"?Imprimir pantalla solo copia al portapapeles, ¿qué sucede cuando pegas en Paint?

Si su función WindowtoDIB() solo 'captura' la ventana que le pasa, entonces sí, sus ventanas secundarias MDI no aparecerán.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top