1

私の問題は、未回答の関連する質問 ( Windows 7 で GLUT を使用した OpenGL、フルスクリーン モードではメッセージ ボックスが表示されない) と同じようです。

開発環境として Win7 に切り替えてから、アプリケーションのターゲット プラットフォームとして使用できる可能性があるため、動作が後退していることに気付きました。

フルスクリーンの OpenGL コンテキストを含むフルスクリーン ウィンドウを表示すると、アプリケーションでモーダル ダイアログ ボックス (メッセージ ボックス、ファイルを開くダイアログなど) を表示する際に問題が発生します。

ウィンドウは WS_POPUP スタイルで作成されています。GL コンテキストは特別なものではありません。そして、すべてが Windows XP で問題ありません。

Windows 7 での問題は、モーダル ダイアログ ボックスが開いたときに見えないことです (フル スクリーン ウィンドウの背後に表示される可能性があります)。ダイアログを表示するには、アプリケーションを Alt-Tab する必要があります。

アプリケーションはフリーズしているように見えますが、実際にはユーザーの入力を待っているため、これは大きな問題です。

誰かがこの動作に遭遇しましたか? 誰かが回避策を知っていますか?

サンプル テスト アプリケーションを簡単に作成しました。そのソース コードはhttp://pastebin.com/K4v2NNDsにあります。簡単な MSVC8 プロジェクトは、ここにあります。

PS。opengl.org フォーラムにも投稿しました。両方をフォローしている方には申し訳ありません。

編集

Chris のコメントのおかげで、WM_TIMER や WM_RBUTTONUP などのさまざまなイベントでモーダル ダイアログをテストしましたが、問題はまだ残っています。

また、チェックするために「DWM_EC_DISABLECOMPOSITION」で「DwmEnableComposition」を呼び出しました:問題はまだあります。

また、OpenGL ビットを DirectX に置き換えてアプリケーションをテストしましたが、この方法ですべてが期待どおりに機能します...実際に問題を引き起こしているのは OpenGL です。

(更新されたペーストビンhttp://pastebin.com/Rq1Ehm3wと私のスクラッチパッド)

編集

この問題は Windows 8 でも発生します。

4

4 に答える 4

1

回避策がJoseph Steel によってopengl.org に投稿されているので、参照用にここにも記載します。

この問題に対して私が見つけた解決策は、ウィンドウのピクセル形式が WGL_SWAP_EXCHANGE_ARB ではなく WGL_SWAP_COPY_ARB スワップ メソッドを使用するようにすることでした。

ピクセル形式を取得するには、「wglChoosePixelFormatARB」を使用する必要があることに注意してください。

「PFD_SWAP_COPY」フラグを使用して従来の「ChoosePixelFormat」を試してみましたが、私のシステム (Win7 x64 + NVidia GeFo 9600GT v196.21) では動作しません。代わりに「PFD_SWAP_EXCHANGE」を使用して常にピクセル形式を返すためです。

ディスプレイにティアリングが発生するため、結果には半分満足していますが、少なくとも機能します!

参考までに、テスト ソース コードを更新しました。

編集、2013年12月

この回避策は、少なくとも私のシステム (ラップトップ、Optimus GeForce 650M) では機能しません。WGL_SWAP_COPY_ARB は設定されていますが、モーダル ダイアログが表示されません。これまでのところ、1 ピクセルの境界線を持つウィンドウを作成する (WS_BORDER を WS_POPUP スタイルに追加する) とうまくいき、「フルスクリーン」モードに入るのを防いでいるようです。

于 2010-03-08T17:07:15.237 に答える
0

Win7 64 ビットの OpenGL でも同じ問題がありました。モーダル ダイアログ ボックスとモーダル ウィンドウは表示されず、バックグラウンドでアクティブになります。私のプロジェクトでは、ステレオ ディスプレイ (クワッド バッファー) を使用していました。私の場合、問題はディスプレイ アダプター (Nvidia Quadro FX3800) のコントロール パネルの設定が正しくないことが原因でした。設定は「ステレオ有効」で、誤って「オフ」になっていました。それをオンにすると、問題は解決しました。

于 2013-12-04T16:00:55.277 に答える