2

ここに単純な Windows アプリケーションがあります。

http://www.bengoodger.com/software/chrome/dwm/app.cc

私のアプリは、DWM 合成がアクティブなときはカスタマイズされたグラス フレームを提供し、非アクティブまたは利用できないときは完全なカスタム フレームを提供します。

「カスタマイズされたガラス フレーム」は拡大されたタイトル バー領域で構成されています。これは_、透明なコントロールをレンダリングしたいので、クライアント領域の一部である WM NCCALCSIZE の実装によって報告されます。ウィンドウのこの「高いタイトル バー領域」の部分が透明になるように、透明な黒 (上記の単純な例では BLACK_BRUSH) で塗りつぶし、DWM によってガラスとして描画されます。

たとえば、外観設定コントロール パネルを使用して Vista Basic または Windows Standard に切り替えたり、システムで DWM を無効にする必要があるアプリを起動したりして、システムの DWM を切り替えると、アプリは WM_NCPAINT などを処理して完全なカスタム レンダリング モードに切り替わります。 . 元に戻すと、逆のことが予想されますが、これはほとんどの場合発生しますが、「背の高いタイトル バー領域」が真っ黒になります。

ウィンドウの配置を取得し、ウィンドウを非表示にしてから、WM_DWMCOMPOSITIONCHANGED 処理でウィンドウの配置を再度設定することで、この問題を回避できることがわかりましたが、これにより他の恐ろしいバグが発生します (ウィンドウの z オーダーの変更が最も少ない)。

私の質問は - ここで何が間違っているのですか? どういうわけかウィンドウが偽の状態になっているようで、非表示/表示すると修正されます。どうすればこれを防ぐことができますか? ガイダンスをいただければ幸いです。

注:これをいくらか絞り込みました。DWM グラスが有効な場合、クライアント領域の上にレンダリングされる黒く塗られたクライアント領域の部分は、透明にレンダリングされます。Glass 以外から Glass に戻ると、クライアント領域が透明ではなく、真っ黒にレンダリングされることに気付きました。ただし、ウィンドウを最大化して復元すると、ウィンドウは透明に戻ります。その後、ウィンドウのサイズを小さくドラッグしても、上部のウィンドウは透明のままです。大きくドラッグすると、ウィンドウの上部が再び黒くなります。DWM がウィンドウの背後にあるピクセルをキャッシュしており、ウィンドウのサイズを大きくすると、キャッシュが十分に大きくないため、そこに何も描画できなくなるかのようです。この状態をリセットする DWM 関数が見つからないようです。

4

1 に答える 1

2

http://www.codeproject.com/KB/dialog/rtaGlassEffectLib.aspx

お気づきかもしれませんが、GlassEnabled プロパティは、この機能がシステムで有効になっているかどうかをテストするのに最適なプロパティです。その後、ライブラリの使用を開始し、ShowEffect() 関数を呼び出してガラス効果を表示します。アプリケーションの実行中の Aero テーマ !! これにより、アプリケーションの外観に問題が生じる場合があります。

この問題を解決するために、アプリケーションの実行中にシステムに発生した変更を追跡するために、2 つのイベントがライブラリに追加されました。これらの 2 つのイベントは、GlassEffectEnabled イベントと GlassEffectDisabled です。

システムの色が変更されたことを示す WM_SYSCOLORCHANGE メッセージを探して、システムからウィンドウ、アプリケーションに送信されるメッセージを監視することによって、これらのイベントが実装されたことがわかります。したがって、このメッセージの前後で GlassEnabled プロパティの状態を簡単に比較することで、この機能が有効になっているかどうかを判断できます。

于 2009-12-09T15:15:56.280 に答える