0

OpenGL 描画ルーチンを使用して、MFC で構築された社内アプリケーションがいくつかあります。それらはすべて同じコードを使用して画面に描画し、画面を印刷するか、JPEG ファイルに保存します。Windows XP ではすべて正常に動作しており、Vista でも動作させる方法を見つける必要があります。

3 つのアプリケーションでは、すべてが機能します。残りの 1 つでは、ウィンドウの境界線、タイトル バー、メニュー、およびタスク バーを取得できますが、内部は表示されません。前述したように、これらのアプリケーションはまったく同じコードを使用して画面に書き込み、ウィンドウ イメージをキャプチャします。関連しているように見える唯一の違いは、問題のアプリケーションが MFC マルチ ドキュメント インターフェイスを使用しているのに対して、その作業は、単一のドキュメント インターフェイスを使用します。

答えがネット上にないか、思ったよりグーグルが下手です。MSDN フォーラムで質問したところ、GDI ではなく GDI+ を使用するという実際的な提案しか得られませんでしたが、それでも違いはありませんでした。ウィンドウへのポインターを指定して、キャプチャ、印刷、または保存するコードのすべての部分でさまざまなことを試しましたが、明らかにウィンドウ自体の問題です。私はまだ SDI を使用して問題のあるアプリケーションを再構築しておらず、他にアイデアがありません。

誰もこのようなものを見たことがありますか?


私が持っているのは 4 つのアプリケーションです。多くの共通コードを使用し、実際の .h ファイルと .cpp ファイルを共有しているため、描画とスクリーン キャプチャのコードが同一であることがわかります。

*pWnd と、ソースの四角形と宛先のサイズを受け取る WindowtoDIB() ルーチンがあります。Microsoft のコードをわずかに変更したように見えますが、Microsoft の Web サイトで、このファイルに他の関数を見つけました。私の 4 つのアプリケーションのうち、3 つがこれを問題なく処理しますが、1 つがそうではありません。最も明白な違いは、問題の 1 つが MDI であることです。

*pWnd が問題のようです。私は決して MFC の第一人者ではありません。問題は、SDI に 1 つのウィンドウ設定があり、MDI に複数のウィンドウ設定があることにあるように思えます。関数に間違った *pWnd を渡している可能性があります。

その間、64 ビット Vista テスト マシンでは正常に動作するようになりましたが、32 ビット Vista マシンではまだ動作しません。理由がわかりません。前回のテスト以来、私は何も変更していません。他の誰も変更していないと思います。(32 ビット バージョンでは、Print Screen キーは期待どおりに機能しますが、画面を JPEG として保存しません。)

4

5 に答える 5

1

必要なのがCViewのコンテンツである場合は、そうです、それは正しいものである必要があります。画面全体のコンテンツ(少なくともツールバーとステータスバーのないコンテンツ)の場合は、CMainFrame(変更されている可能性のあるデフォルトの名前であり、CMDIFrameWndから派生した名前)を渡す必要があります。 )。

WindowToDIB()のコードを投稿できますか?試したところ、It Works For Me(TM)ですが、ビューにOpenGLコードがありません。次のウィンドウをWindowToDIB()関数に渡してみてください。

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

- mainfrm

- mainfrm->MDIGetActive()

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

そしてあなたが得るものを見てください。

于 2008-09-18T19:14:35.110 に答える
1

質問のタイトルにはスクリーン キャプチャが記載されていますが、実際の質問には記載されていません。もっとわかりやすく説明してください。3 つのアプリケーションのスクリーン キャプチャはできるが、4 つ目のアプリケーションはできないという問題はありますか? OpenGL/DirectX ウィンドウをキャプチャできるさまざまなスクリーン キャプチャ ソフトウェアを使用できます。これらのサーフェスは Window Manager によって直接処理され、単純な「PrtScn」では表示されません。

GDI+ に切り替えても解決せず、SDI に切り替えても解決しません。

于 2008-09-18T13:59:33.730 に答える
0

すみません、まだわかりません。Print Screen キーを 4 つのアプリケーションすべてで機能させようとしているのですか? または、アプリケーション自体の「スクリーンショット」を (独自のアプリケーション内から) 取得して、画像ファイルとして保存できる WindowtoDIB() 関数を機能させようとしていますか?

また、「Print Screen キーは期待どおりに機能しますが、画面が JPEG として保存されません」とはどういう意味ですか? Print Screen はクリップボードにコピーするだけですが、ペイントに貼り付けるとどうなりますか?

WindowtoDIB() 関数が、渡したウィンドウのみを「キャプチャ」する場合、はい、MDI 子ウィンドウは表示されません。

于 2008-09-18T16:54:02.220 に答える
0

各ウィンドウの内容は directX サーフェスであり、グラフィックス カードのウィンドウ マネージャーによってのみアセンブルされます。新しいインターフェイス (DWM) をオフにするか、DWM からの画面キャプチャ専用のコードを作成しない限り、これをキャプチャすることはできません。

ウィキペディアには、デスクトップ ウィンドウ マネージャー (DWM)の適切な説明があります。

于 2008-09-17T20:04:04.253 に答える
0

最終的に、別の OpenGL コンテキストを作成し、それにすべてを描画することで、これを解決しました。画面キャプチャはあきらめました。

于 2009-12-15T16:56:50.600 に答える