元のWinformsコントロールで透明なバックカラーを達成する方法は?
-
30-09-2019 - |
質問
私はここで気にしようとしています。
チェックボックス制御が背後にあるものとブレンドされないのはなぜですか?
質問はすべてのWinformsコントロールに当てはまりますが、これを例として使用しています。
写真は千の言葉の価値があります:
そしてもう少し言葉:
背後にあるもの CheckBox
色が付けられています PictureBox
esとa Button
.
CheckBox
's BackColor
に設定されています Transparent
. 。しかし、どういうわけかそれはそれが共有すべきだということを決定します BackColor
含む Form
(それは透明性の幻想の考え方ですか?)。
これはwinformsでは不可能ですか?私は前にこれをやったことを誓うことができました。
アップデート:
私はこれを試しました:
そのフォームに、を設定します CheckBox
's BackColor
に Transparent
, 、次に変更します BackColor
含む Form
他の色に、そして CheckBox
それに一致します BackColor
. 。何.......?
解決
ボブ・パウエルが書いた 優れた 透明なコントロールに関する記事。見てみな:
他のヒント
これは、Windows Windowsであるコントロールの副作用です。ウィンドウはそれ自体を描く責任があり、オンペイントバックグラウンドとオンペイントの方法がそれを処理します。
このレンダリングモデルは透明性をうまくサポートしていません。階層化されたウィンドウを使用することにより、真の透明性をサポートしています。これはビデオアダプターによって実装されており、Windowsはハードウェアオーバーレイ機能を使用しています。しかし、それは子供の窓ではなく、トップレベルの窓でのみ機能します。フォームに注意してください。
トリックによる透明性に対する部分的なサポートがあります。コントロールは、親ウィンドウに最初にコントロールウィンドウ内に描画するように依頼することで偽造できます。背景ピクセルが生成され、その上に描画できます。バックカラープロパティをColor.Transparentに設定します。これをサポートするコントロールのこのトリックを有効にします。すべてのボタンベース派生クラスは行います。ただし、ネイティブウィンドウコントロールのラッパーであるコントロールではありません。
「親の窓を尋ねる」は、このトリックの欠陥がスクリーンショットで見える場所です。フォームピクセルが表示されています。スタッキングエフェクトは機能しません。Zオーダーの中間窓は、親のみを考慮しません。これは修正可能ですが 非常に 醜い、コードを示すKBの記事があります。
また、注目すべきは、WPFにはこの制限がないことです。コントロールは窓ではなく、親の上に自分自身をペイントすることでレンダリングします。塗料の層。透明性は今では些細なことです。ただペイントしないでください。
チェックボックスのバックカラーを手動で必要な色に設定できますか? (その背後にあるPictureBoxの値)
「透明」とは、MSにしたいものとは異なるものを意味する場合があります。
また、PictureBoxesのZorderを変更してみてください(前面に持ち込みます)、チェックボックスの根底にある色が変更されるかどうかを確認してください。