- PR -

コントロールの背景を透明にする方法

投稿者投稿内容
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-24 20:28
引用:

当初の課題はRegionで解決できましたか?


はい。当面の要件は解決しました。

引用:

alphaBlendTextBoxのコードを使うと背景が透明化され、またコントロールのオーバーラップに対応できます。
Panelは操作を誤ると該当TextBoxがPanel内部に取り込まれる(Addされる)恐れがありますので注意ください。
PanelにAddされた場合は一度取り出し、該当TextBoxが部分的にPanelに重なるように配置してみてください。
その際に該当TextBoxのZ-orderが最前面になるように設定してください。



あらたにプロジェクトを起こし、TextBoxを貼り付け、それに一部かぶさるように
alphaBlendTextBoxを配置してみましたが、下にあるTextBoxの重なった部分は
まったく消えてしまい、フォームのイメージが表示されました。
この挙動はBackColorをTransParentにしたlabelと同じでした。

もちろん、TextBoxだとフォームのイメージすら表示しないわけですし
テキストボックスの用途から考えるとこれで十分だし、
標準で透明色をサポートしてほしいというのは当然のことだと思います。

ありがとうございました。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-10-24 22:39
AlphaBlendTextBox自身ではなく、下記アドレスの下部メッセージ欄の末尾
lalachaさんのRe: How to make the richtextbox transparent
にあるコードが適切でした。ごめんなさい
http://www.codeproject.com/cs/miscctrl/alphablendtextbox.asp#xx997877xx
_________________
IEEE-CSDP 2004-2007

[ メッセージ編集済み 編集者: iStation 編集日時 2005-10-24 22:43 ]
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-25 00:16
引用:

iStationさんの書き込み (2005-10-24 22:39) より:
AlphaBlendTextBox自身ではなく、下記アドレスの下部メッセージ欄の末尾
lalachaさんのRe: How to make the richtextbox transparent
にあるコードが適切でした。



この記事はAlphaBlendTextBoxをRechTextBoxでも使えるようにするという話ではないのでしょうか?

私の読み違いであればごめんなさい。

そもそもAlphaBlendTextBoxにしても、この記事にしても
SetStyle(ControlStyles.SupportsTransparentBackColor, true)
をやっているようで
その挙動はlabelと同様であろうと思われますがいかがでしょうか?

AlphaBlendTextBoxもここで書かれている
引用:

Me.SetStyle(ControlStyles.DoubleBuffer _
Or ControlStyles.UserPaint _
Or ControlStyles.AllPaintingInWmPaint, _
True)


を設定した後でSupportsTransparentBackColorを呼び出していたように思います。

完全にコードを把握していないので断定はできませんが
イメージ的には、TextBoxやRechTextBoxが独自に描画している部分をなんとかスルーさせるための工夫をたくさんしているように見えました。

.Netのコントロールの実装が、Controlから派生しているにもかかわらず
OnPaintBackgroundなどあってないようなものだったりします。

そもそも継承もとのControlの仕様は非常によくできているように見えますし
WindowsMessageのレベルで制御しなければならないような仕様ではないはずなんですが
派生先のコントロールの実装となるとそのコントロールが派生されることをまったく考えていないように私には見えています。

そういうわけで、AlphaBlendTextBoxなどが例に出されるように
開発者のストレスがたまっているのかもしれないなと思っています。

それともうひとつ、蛇足かもですが

どうやらコントロールの重なり部分についての透明性については
私が考えていたような「書かなければいい」というわけには行かないようです。

OnLayoutを止めてたりとか、いろんな実験をしてみてわかったのですが
どうやらフォームなどのコンテナは自分が持つ子コントロールのリージョンを除外して
自分のリージョンとしているようです。

この工夫はパフォーマンス上重要なものであるように思えます。

フォームのTransparencyKeyを設定した状態でOnPaintで描画してみました。
後ろにあるフォームを動かせば、OnPaintが呼ばれると思い込んでいましたが
背景が変わってもいっこうに呼ばれない。

つまり、下から順番に重ね描きしているのではなく
ほんとに変更された部分のみ描くということのようです。

そうなると上に乗っているコントロールは自分自身の背景を自分で書かなければならない
ということも必然であるように思えてきます。

特にコントロールの場合は何層にも重なる可能性が高いですから
うーん、なるほどなぁと、再認識しているところです。

なかなか奥の深い問題のようで、軽々しく「そんな簡単なことがなんでできないんだろう」
なんて書いてしまったことを恥ずかしく思っています。

徒然書いてしまいました。失礼しました。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-10-25 07:22
引用:

...
この記事はAlphaBlendTextBoxをRechTextBoxでも使えるようにするという話ではないのでしょうか?


このコードは、AlphaBlendTextBoxとは別物です。
AlphaBlendTextBoxのソースを使用しないでも、普通のRichTextBoxを透明化することができます。
_________________
IEEE-CSDP 2004-2007

[ メッセージ編集済み 編集者: iStation 編集日時 2005-10-25 19:26 ]

スキルアップ/キャリアアップ(JOB@IT)