31

ガラスを表示するには、クライアント領域にどの色を塗る必要がありますか?

以下を使用して、フォームのフレームをクライアント領域に拡張しました。

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フォームで拡張ガラスフレームを機能させることができます。

も参照してください

4

3 に答える 3

2
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

これは実際にはかなり面白いです。これは、完全に透明なものを描画していることを意味します。したがって、これはまったく変更されません。:-)

推測:黒(0,0,0)が「ガラス」を意味する場合、(ほぼ)黒になるように(1,1,1)を描画するのはどうですか?

于 2009-12-09T10:00:35.313 に答える
2

上記でリンクしたブログ投稿の 1 つに、これに関する議論があります。本来の解決策はSetLayeredWindowAttributes、カラー キーを黒から切り替えるために使用することでした。

于 2009-12-09T20:54:03.530 に答える
1

フォームの TransparencyKey を Color.FromArgb(1,1,1) (または選択した他の適切な値) に設定してから、フォーム (またはガラスにしたい部分) の背景色を同じ値に設定してみてください。

それが、黒いテキストをすべて透明/ガラスにすることなく機能させる方法です。

しかし、ガラスに「光る」テキストをペイントする方法がわかりませんでした。その背後には常に黒い長方形がありました。

于 2009-12-09T20:46:46.770 に答える