ガラスを表示するには、クライアント領域にどの色を塗る必要がありますか?
以下を使用して、フォームのフレームをクライアント領域に拡張しました。
DwmExtendFrameIntoClientArea(self.Handle, margins);
DWMがガラスに置き換えるために探す色やアルファに関するMicrosoftの公式ドキュメントが見つかりません。DwmExtendFrameInClientAreaのドキュメントには、カスタムカラーが必要であるとさえ記載されていません。特別な色さえ必要であるという伝聞と神話だけがあります。
私が見つけることができる最も近いものは、MSDNのトピックです:
DWMを使用したカスタムウィンドウフレーム
拡張フレームを表示するには、拡張フレームの各辺の下にある領域に、アルファ値が0のピクセルデータが含まれている必要があります。
更新:そしてブログ投稿:
開発者向けWindowsVista–パート3 –デスクトップウィンドウマネージャー
たまたま、RGB黒(0x00000000)のビットパターンは100%透明ARGBのビットパターンと同じであるため、実際に「黒」のGDIブラシで描画でき、DWMにペイントされた領域をぼかすように指示したと仮定します。結果は、望ましいガラス効果になります。
彼らが文字通り言っていること(アルファ値がゼロのピクセルデータ)をとると、アルファがゼロの色を作成し、それを拡張領域にペイントします。
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
ただし、ガラス効果は表示されません。
引用されたMSDNトピックを無視し、代わりに(完全に透明な黒ではなく)完全に不透明な黒を使用する場合:
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
ガラス効果が表示されます:
次に、不透明な黒がDWMがガラスに置き換えるために探すピクセル値であると信じるようになります。
しかし、どうすればガラス領域に黒いアイテムをペイントできますか?
ガラス領域に黒い長方形をペイントし、その横に円を描くことをテストしました。奇妙なことに、長方形は表示されませんが、円は表示されます。両方とも同じ色です:
Brush b = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
e.Graphics.FillRectangle(b, 11, 11, 32, 32);
e.Graphcis.FillEllipse(b, 43, 11, 32, 32);
では、世界で何が起こっているのでしょうか?ガラスを表示するために拡張フレーム領域にペイントする適切な色は何ですか?
アップデート2
Adisakの提案を使用して、Aeroの愚かさがどこにあるかを正確に特定します。ここでは、黒い円の内側に黒い長方形を描きます。
FillEllipseは黒丸の描画をサポートしていませんか?
アップデート3
Pondidumは、 Graphics.Clearを透明な黒色で呼び出すと、ガラスが見えるようになるかどうか疑問に思いました。
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
それは機能しますが、それでもガラスに不透明な黒いアイテムを描くことはできません。
アップデート4
MicrosoftのVistaBridgeLibrary (.NETに追加されないVista機能のマネージラッパー)を見ると、WinFormsではなくWPFフォームで拡張ガラスフレームを機能させることができます。