2011-07-11 9 views
3

セットアップ:私は領域が定義された領域(SetWindowRgn()で作成)を持っており、 (SetWindowPos()で)、そのピクセルのいくつかが親のウィンドウ領域のクリップされた部分と重なるようにします。ウィンドウ領域、移動中の子、DWM、作成することができる白いブロックのつぶやき

結果:これらのピクセルは完全に透明ではなく(親の領域外にあるため)、完全に不透明で完全な白のピクセルで塗りつぶされます。子ウィンドウがどのように見えるのかにかかわらず、問題のピクセルが白であるため、子ウィンドウが描画されてはならないときに描画されているわけではありません。

以下では、小さなオレンジの子ウィンドウが親のエッジに沿って少し移動しました。これは透明なウィンドウ領域を持つ辺に沿ってのみ発生します(したがって、白いピクセルは常に親ウィンドウの最大矩形内に制限されます)。

enter image description here

親ウィンドウが非表示にして、(単に無効と再描画を強制的に白画素をクリアしていない)に示されている場合物事は自分自身を修正します。

これはVistaと7の両方で確認されています。デスクトップウィンドウマネージャ(DWM)を無効にすると、この動作はなくなります。 1つのケースでは、グラフィックドライバを更新した後も消えてしまいました。おそらくそれはこの問題に関連しているでしょうか?:Vista live thumbnail issue with SetWindowRgn。私はもともとこれを稀なバグとして報告するつもりでしたが、それは十分な精査を保証するために十分に切り取ったものです。

これまでに他の誰かがこれまでに対抗していますか? DWMとウィンドウ領域がどのように相互作用するかについての洞察はありますか?

また、私はアプリケーションごとにDWMを無効にすることができますが、起動時とシャットダウン時に画面が飛び出すのに加えて、アプリケーションの実行中にすべての機能を無効にすることができます。問題。

+0

別のグラフィックスカード(別のマシン)で試しましたか? また、塗料のアルファチャンネルを正しくGDIペイントしていることを確認しましたか? –

+0

これは実際にはアルファチャンネルがないため、原因を絞り込むために物事を単純化しているためです。テストの唯一の透明画はウィンドウ領域からのものです。私はかなりのマシンで試してみましたが、ほとんどの人がこの問題を抱えていません。実際にこの問題を抱えているのはほんの一握りのマシンですが、毎回再現可能なマシンです。 –

+0

故障しているすべてのマシンに共通のビデオカードメーカーがありますか?あなたの情報に基づいて、私はビデオドライバのバグを強く疑う。 –

答えて

1

私自身の質問に再度答えるのは嫌ですが、回避策を見つけました。私は、ウインドウの領域を設定すると、醜い再描画や他の場所での点滅を引き起こすことなく、浮遊する白いピクセルを再びクリアすることが分かりました。これは私が設定しています領域は、既存の領域と同じであるので、このような単純なものが動作しても動作します:追加ボーナスとして

HRGN hRgn = CreateRectRgn(0,0,0,0); 
GetWindowRgn(hWnd, hRgn); 
SetWindowRgn(hWnd, hRgn, true); 
DeleteObject(hRgn); 

、もし私(むしろこの問題のもう一つの奇妙な側面として、あるいは)ウィンドウを移動する直前にこれを呼び出すと、白いピクセルは表示されませんが、私のベースをカバーするだけで、ウィンドウの翻訳をアニメーション化する前と後の両方でこのステップを実行します。

この問題は、作成後にウィンドウを配置している状態である可能性があります。このウィンドウは、領域を再設定することでクリアされます。根本的な原因を知ることはうれしいことですが、ドライバのバグを回避しようとしているように感じるので、おそらく根本原因がわからないでしょう。

関連する問題