Question

Certaines applications internes sont intégrées à MFC, avec des routines de dessin OpenGL. Ils utilisent tous le même code pour dessiner sur l’écran et l’imprimer ou le sauvegarder dans un fichier JPEG. Tout fonctionne correctement sous Windows XP et je dois trouver un moyen de les faire fonctionner sous Vista.

Dans trois de nos applications, tout fonctionne. Dans le dernier, je peux obtenir la bordure de la fenêtre, la barre de titre, les menus et la barre de tâches, mais l'intérieur ne s'affiche jamais. Comme je l'ai dit, ces applications utilisent exactement le même code pour écrire à l'écran et capturer l'image de la fenêtre. La seule différence qui me semble pertinente est que l'application à l'origine du problème utilise l'interface multi-documents MFC, tandis ce travail utilise l'interface à document unique.

Soit la réponse n'est pas sur le net, soit je suis pire que je le pensais sur Google. J'ai demandé sur les forums MSDN, et la seule suggestion pratique que j'ai eu était d'utiliser GDI + plutôt que GDI, et cela n'a fait aucune différence. J'ai essayé différentes choses avec chaque partie du code qui capture et imprime ou enregistre, en donnant un pointeur sur la fenêtre, donc apparemment, c'est une question de fenêtre. Je n'ai pas encore reconstruit l'application incriminée à l'aide de SDI et je n'ai vraiment aucune autre idée.

Quelqu'un a-t-il déjà vu quelque chose comme ça?

Ce que j’ai, ce sont quatre applications. Ils utilisent beaucoup de code commun et partagent les fichiers .h et .cpp. Je sais donc que le code de dessin et de capture d’écran est identique.

Il existe une routine WindowtoDIB () qui prend un * pWnd, un rectangle source et une taille de destination. Il semble que le code Microsoft soit très légèrement adapté et j'ai trouvé d'autres fonctions dans ce fichier sur le site Web de Microsoft. Sur mes quatre applications, trois gèrent parfaitement, mais une ne le fait pas. La différence la plus évidente est que le problème est le MDI.

Il me semble que le problème est celui du * pWnd. Je ne suis pas un gourou du MFC, et il me semble que le problème est peut-être que nous avons une fenêtre configurée dans les interfaces SDI et plus d'une dans l'interface MDI. Je passe peut-être le mauvais * pWnd à la fonction.

Entre-temps, il fonctionne correctement sur la machine de test Vista 64 bits, bien que cela ne fonctionne toujours pas sur la machine Vista 32 bits. Je ne sais pas pourquoi. Je n'ai rien changé depuis les derniers tests et je ne pensais pas que quelqu'un d'autre l'ait fait. (Sur la version 32 bits, la touche Imprimer l'écran fonctionne comme prévu, mais elle n'enregistre pas l'écran au format JPEG.)

Était-ce utile?

La solution 5

Nous avons finalement résolu ce problème en créant un contexte OpenGL différent et en y attirant tout le contenu. Nous avons abandonné la capture d'écran.

Autres conseils

Le titre de votre question mentionne la capture d'écran, mais pas votre question. S'il vous plaît élaborer plus clairement. Est-ce que le problème que vous pouvez faire une capture d'écran de trois de vos applications, mais pas la quatrième? Vous pouvez utiliser différents logiciels de capture d'écran pouvant capturer des fenêtres OpenGL / DirectX. Ces surfaces sont gérées directement par le gestionnaire de fenêtres et ne s'afficheront pas avec un simple "PrtScn".

Le passage à GDI + ne le résoudra pas, pas plus que le passage à SDI.

Si c'est le contenu du CView que vous voulez, alors oui, ça devrait être bon. S'il s'agit du contenu de la totalité de l'écran (au moins le contenu, sans les barres d'outils et la barre d'état), transmettez-lui le CMainFrame (c'est le nom par défaut qui a peut-être été modifié, celui dérivé de CMDIFrameWnd. ).

Pouvez-vous poster le code de WindowToDIB ()? Je viens de l'essayer et It Works For Me (TM), mais sans code OpenGL dans la vue. Essayez de passer les fenêtres suivantes à votre fonction WindowToDIB ():

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

- mainfrm

- mainfrm->MDIGetActive()

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

et voyez ce que vous obtenez.

Le contenu de chaque fenêtre correspond à des surfaces directX et n’est assemblé que par le gestionnaire de fenêtres de la carte graphique. Vous ne pourrez pas capturer ceci à moins que vous ne désactiviez la nouvelle interface (DWM) ou le code spécifiquement pour la capture d'écran à partir du DWM.

Wikipedia a une bonne description du gestionnaire de la fenêtre du bureau (DWM)

.

Désolé, je ne comprends toujours pas. Vous essayez de faire en sorte que la touche Impr écran s’applique aux quatre applications? Ou essayez-vous de faire fonctionner la fonction WindowtoDIB (), qui prend une "capture d'écran" (au sein de votre propre application) de l'application elle-même, afin qu'elle puisse être enregistrée en tant que fichier image?

Par ailleurs, que voulez-vous dire par "la touche Impr écran fonctionne comme prévu, mais elle ne sauvegarde pas l’écran au format JPEG."? Imprimer l’écran ne copie que dans le presse-papiers, que se passe-t-il lorsque vous collez dans Paint?

Si votre fonction WindowtoDIB () ne "capture" que la fenêtre que vous lui transmettez, alors oui, vos fenêtres enfants MDI ne seront pas affichées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top