Frage

Wir haben einige Inhouse-Anwendungen in MFC, mit OpenGL Zeichnung Routinen eingebaut bekommen. Sie alle nutzen den gleichen Code auf dem Bildschirm zu zeichnen und entweder den Bildschirm drucken oder in eine JPEG-Datei speichern. Alles ist schon gut funktioniert unter Windows XP, und ich brauche einen Weg zu finden, um sie auf Vista arbeiten zu lassen.

In drei unserer Anwendungen, alles funktioniert. In der verbleibenden, kann ich den Fensterrand, Titelleiste, Menüs und Taskleiste, aber das Innere zeigt nie auf. Wie gesagt, verwenden diese Anwendungen mit der exakt gleichen Code auf dem Bildschirm zu schreiben und das Fenster Bild aufzunehmen, und der einzige Unterschied, den ich sehen, dass sieht aus wie es relevant sein könnte, ist, dass das Problem Anwendung die MFC Multiple Document Interface verwendet, während diejenigen, verwenden, dass die Arbeit der einzelnen Dokument-Schnittstelle.

Entweder ist die Antwort nicht auf dem Netz, oder ich bin schlimmer bei googeln, als ich dachte. Ich fragte, auf den MSDN-Foren, und der einzige praktische Vorschlag, den ich bekam, war GDI zu verwenden + anstatt GDI, und das tat nichts anderes. Ich habe mit jedem Teil des Codes verschiedene Dinge ausprobiert, die erfaßt und drucken oder speichern, einen Zeiger auf das Fenster gegeben, so offensichtlich ist es eine Frage des Fensters selbst. Ich habe nicht die problematische Anwendung umgebaut noch mit SDI, und ich habe nicht wirklich irgendwelche andere Ideen.

Hat jemand etwas gesehen?


Was ich habe vier Anwendungen. Sie verwenden eine Menge von gemeinsamen Code, und teilen sich die tatsächlichen .h und CPP-Dateien, so dass ich weiß, dass die Zeichnung und Screen-Capture-Code identisch ist.

Es gibt eine WindowtoDIB () Routine, die eine * pWnd nimmt, und ein Quellrechteck und Zielgröße. Es sieht aus wie sehr leicht angepasst Microsoft-Code, und ich habe andere Funktionen in dieser Datei auf der Microsoft-Website zu finden. Von meinen vier Anwendungen behandeln drei dies ganz gut, aber man tut es nicht. Der offensichtlichste Unterschied ist, dass das Problem ist MDI.

Es scheint mir, wie das * pWnd das Problem ist. Ich bin kein MFC-Guru noch lange, und es scheint mir, dass das Problem sein kann, dass wir ein Fenster Setup im SDIs haben, und mehr als eine in der MDI. Ich kann die falsche * pWnd zur Funktion werden übergeben.

In der Zwischenzeit hat es angefangen richtig auf der 64-Bit-Vista-Test-Maschine arbeiten, obwohl es noch nicht auf dem Rechner Vista 32-Bit funktioniert. Ich habe keine Idee warum. Ich habe nichts, da die letzten Tests verändert, und ich glaube nicht, jemand anderes hat. (Auf der 32-Bit-Version, die Druck-Taste funktioniert wie erwartet, aber es nicht auf den Bildschirm als JPEG speichern.)

War es hilfreich?

Lösung 5

Wir lösten schließlich diese durch einen anderen OpenGL-Kontext zu schaffen, und alles, was zu der Zeichnung. Wir gaben auf dem Screen-Capture.

Andere Tipps

Ihre Frage Titel erwähnt Screen-Capture, aber Ihre eigentliche Frage nicht. Bitte näher deutlicher. Ist das Problem, dass Sie Bildschirmaufzeichnung von drei Ihrer Anwendungen zu tun, aber nicht der vierte? Sie können verschiedene Screen-Capture-Software verwenden, die OpenGL / DirectX Fenster erfassen kann. Diese Flächen werden direkt vom Window Manager behandelt und zeigen nicht mit einem einfachen ‚PrtScn‘ auf.

Die Umstellung auf GDI + wird es nicht lösen, noch wird zu SDI umgeschaltet wird.

Wenn es der Inhalt des CView ist, die Sie wollen, dann ja, das sollte richtig sein. Wenn es um den Inhalt des gesamten Bildschirms ist (zumindest den Inhalt, ohne die Symbolleiste (n) und Statusleiste), dann sollten Sie ihm den CMainFrame passieren (das ist der Standardname, die geändert wurden, derjenige, der von CMDIFrameWnd ableitet ).

Können Sie den Code von WindowToDIB () posten? Ich habe versucht, es einfach und es funktioniert für mich (TM), aber ohne OpenGL-Code in der Ansicht. Versuchen Sie vorbei die folgenden Fenster auf Ihre WindowToDIB () Funktion:

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

- mainfrm

- mainfrm->MDIGetActive()

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

und sehen, was Sie erhalten.

Der Inhalt jedes Fenster sind directX Oberflächen und sind nur durch die Window-Manager in der Grafikkarte montiert. Sie würden nicht in der Lage sein, dies zu erfassen, wenn Sie die neue Schnittstelle (DWM) oder Code speziell für Screen-Capture aus der DWM auszuschalten.

Wikipedia hat eine gute Beschreibung der Desktop Window Manager (DWM)

Sorry, ich verstehe immer noch nicht. Sie versuchen die Druck-Taste auf allen vier Anwendungen zur Arbeit zu kommen? Oder Sie versuchen, die WindowtoDIB () Funktion zur Arbeit zu kommen, die einen ‚Screenshot‘ nimmt (aus Ihrer eigenen Anwendung) der Anwendung selbst, so dass sie als Bilddatei gespeichert werden?

Auch, was meinst du mit ‚er Bildschirm Schlüsselwerke drucken, wie erwartet, aber es nicht auf den Bildschirm als JPEG speichern.‘? Print Screen nur in die Zwischenablage kopiert, was passiert, wenn Sie in Paint einfügen?

Wenn Ihr WindowtoDIB () Funktion nur ‚Captures‘ das Fenster, das Sie es passieren, dann ja, Ihr Kind MDI-Fenster werden nicht angezeigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top