1

3つのMDIウィンドウを備えたアプリケーションがあり、それらすべてにOpenGLコンテンツが表示されています。XPでは、すべてが正常に機能します。ただし、Vista / Win7では、mdiの子ウィンドウが正しく更新されません。

起動後、すべてのウィンドウにコンテンツが正しく表示されます。しかし、フォーカスを1つのmdiウィンドウから次のウィンドウに変更すると、これら2つのウィンドウはクリアされます(つまり、白のみが表示され、コンテンツは表示されません)。なぜウィンドウがクリアされるのかわかりません。ウィンドウがクリアされても、WM_ *メッセージは受信されません。もちろん、WM_PAINTメッセージも受信されません。

これらのウィンドウのサイズを変更すると、(WM_SIZEの後に)WM_PAINTメッセージが正しく表示され、コンテンツが再描画されますが、ウィンドウもクリアされるため、サイズ変更中に奇妙なちらつきが発生します。サイズ変更を停止した後、手動で強制的に更新するまで、ウィンドウはクリア(白)のままになります。

これは、Aeroの有効化または無効化とは関係なく発生します。

なぜこれが起こるのか考えていますか?

4

1 に答える 1

3

XPで動作することに驚いています。私の(限られた)OpenGLでの経験では、WM_PAINTがOpenGLシーンを再描画するのに常に最適な場所であるとは限りません。ほとんどの場合、コンテンツはドライバーレベルで消去されています。これを確認するには、MDIウィンドウの1つが2つの異なるビデオカードに接続された2つのモニターにまたがっている場合に何が起こるかを確認します。

次のことを試してください。

  1. WM_SIZEが発生した後、OpenGLコンテキストを再初期化します。
  2. WM_PAINTではなくオンデマンドで描画します。WM_PAINTのハンドラーでは、何もしません。タイマーまたはその他のメカニズムを使用して、ディスプレイの更新を定期的にトリガーします。
  3. ちらつきは通常、WM_ERASEBKGNDを介した干渉によって引き起こされます。まだ行っていない場合は、WM_ERASEBKGNDをインターセプトし、OpenGLコンテンツを表示している領域では何もしません。
  4. OpenGLコンテンツをホストしているウィンドウでCS_OWNDCウィンドウスタイルを使用して、MDIウィンドウの存続期間中にHDCがメッセージごと/呼び出しごとに変更されないようにします。

適用される可能性のあるその他のまれな干渉の原因(MDIウィンドウを使用しているため)

  1. WM_NCPAINTおよびその他の関連する非クライアント描画メッセージ-OpenGLコンテンツを、MDIウィンドウ内の境界線のない子ウィンドウに移動することでこれらを回避できます。
  2. 明示的にオーバーレイを必要とする、または暗黙的にオーバーレイを使用する、ビデオカードのOpenGLの正しくない/互換性のないデフォルト機能(重複するコンテキストでの問題の頻繁な原因)。残念ながら、私の知識の領域からこれを診断しますが、いくつかのテストはここでいくつかの追加の光を当てる可能性があります。
于 2009-11-17T17:05:03.027 に答える