2017-03-20 26 views
1

私は透明なフォームを持っています。透明度の高いものを描画しようとすると、単に機能しませんアルファ変数が0に近づくにつれて、描画される色は元の色に近づくようになります(背景色と透明度キーを一致させるだけで簡単に行えます)透明なフォームCで不透明度を描画する

フォームの背景色。

SolidBrush opaqueBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255)); 
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255)); 
SolidBrush superTransBrush = new SolidBrush(Color.FromArgb(10, 0, 0, 255)); 

所望の効果につながる通常のフォーム上に描画するには、これらの3つのブラシを使用して。しかし、私の透明​​フォーム上でそれを使用して、単に私のtransparencyKey /背景色とsuperTransBrushにマッチし、semiTransBrush希望の色と背景の間のどこかにあります。これはとにかくこの周りですか?

+0

BG /透過色を緑色に設定し、ブラシが青色に設定されている場合は、アルファ値128で青と緑が混在していますか? – Phylyp

+0

対象とするもの:Winforms、WPF、ASP ..? __Always__あなたの質問に正しくタグを付けてください! - _アルファ変数が0に近づくにつれ、描画される色は単にフォームの元の背景色に近づきます._実際、それはどのようなものですか。どのように他のだろうか? __one正確な透明キーkey color__だけが透明になります。他のピクセルはそうではありません。それのまわりには道がない。あなたはキーカラーとして(254,254,254,254)のような色を選んでみることができますが、まだ白が混じっています。 - また、なぜGDI +の代わりに 'GDI'をタグ付けしましたか? – TaW

+0

WPFをターゲットにしているようですか?私はかつて透明性に問題がありました。私が欠けていたパズルのビットはこれでした:上のものの見た目の色は、その下にあるものの合計です。あなたが見る最終的な色は、次の色を上書きする1つのレイヤーよりも、色のついたガラスの部分を重ねるようなものです。 –

答えて

0

背景

Windowsフォームは、GDIとGDI +の上に構築されています。

GDIはWindowsの歴史の中で非常に古い技術であり、アルファに対応するようには設計されていません。

GDI +は、WindowsXPおよびその後継製品に同梱されており、最新の2Dグラフィックスライブラリで期待されるアルファブレンディング、アンチエイリアスなどの機能をGDIに補完するように設計されています。

GDI +はGDIアルファを認識​​せず、場合によってはアルファベットのみを偽造します。あなたのケースでは

あなたのシナリオ

、フォームに透明度の操作を実行する前に、このように、レンダラは異なる色を見て、アルファチャンネルを偽造し、フォーム上にSolidBrush色を図面の透明のために指定したものと無視します。私の場合は

私のシナリオ

、私はボーダレスフォームにドロップシャドウを描画しようとしていました。出来た。それは地獄のようにバギーだった。

私はあなたがしようとしていることを達成しましたが、純粋にManaged C#/ NETでそれを行うことはありません。 P/Invokeを使って直接GDI/GDI +を呼び出さなければなりません。

1

.NETフォーム自体からこれを回避する方法はないようです。

alpha blending in .NET状態の定義: - 色が背景色とブレンドある れる程度

アルファ値は、色の透明度を示します。アルファ値 は0〜255の範囲で、0は完全に透明な の色を表し、255は完全に不透明な色を表します。

アルファブレンディングは、ソースとバックグラウンドカラーデータのピクセルごとのブレンディングです( )。所与のソース色(青、緑、赤、、) 3つの成分の各々は、以下の式に従って背景色 の対応する成分とブレンド ある:

displayColor = sourceColor × alpha/255 + backgroundColor × (255 – alpha)/255 

注意NOがありますアルファブレンディングの計算時に背景自体の透明度に配慮すること。

最も近い問題を回避するには、ソースコピーにCompositingModeを設定するために、次のようになります。

e.Graphics.CompositingMode = CompositingMode.SourceCopy; 

これは、代わりに青+背景のブレンドので、あなたのブラシが青になり、背景色と透明色をブレンド防止色。ただし、ブラシはまだ不透明です。

関連する問題