DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Labelの透過について

環境/言語:[WinXP,VB.NET]
分類:[.NET]

初めて投稿させていただくkoheiといいます。
VB.NETを使って簡単なプログラムを作っているのですが、
.NET Tips内の「PictureBox上のLabelの背景が透明にならない問題の解決法」
を応用して二段透過が出来ないかと思って試してみたところ、
(PictureBox1,PictureBox2,Label1を使って、PB1の上にPB2,PB2の上にLabel1を透過する)
やってみると、PB2は透過してPB1の画像が見えるのですが、
Label1のバックは(透過はするのですが)PB2の左上のところから(PB1の透過された画像)になってしまいます。
どうすればうまく表示できるのでしょうか。
分かり難い説明で申し訳ありませんが、よろしくお願いします。
(一応検索はして見たのですが、もし同じスレッドがあったらすみませんm(_ _)m)
> を応用して二段透過が出来ないかと思って試してみたところ、
> (PictureBox1,PictureBox2,Label1を使って、PB1の上にPB2,PB2の上にLabel1を透過する)
> やってみると、PB2は透過してPB1の画像が見えるのですが、
> Label1のバックは(透過はするのですが)PB2の左上のところから(PB1の透過された画像)になってしまいます。
> どうすればうまく表示できるのでしょうか。

こんにちは。

いまいち状況が掴めませんが、どの親に対して透過させたいのかを
もう一度確認してみてはどうでしょうか?
Labelの親がPictureBox1になっているのではないでしょうか?
PictureBox2を親にするといいような気がします。
> いまいち状況が掴めませんが、どの親に対して透過させたいのかを
> もう一度確認してみてはどうでしょうか?
> Labelの親がPictureBox1になっているのではないでしょうか?
> PictureBox2を親にするといいような気がします。

すみません、説明が足りなかったようです。
PictureBox1とPictureBox2の両方のImageを設定して、
(PictureBox2の画像はMicrosoft Photo Editorで透過性50%で透過したもの)
PictureBox1を一番下、その上にPictureBox2、さらに上にLabel1を配置し、
Label1はBackColor=Transparent・PictureBox2.Controls.Add(Label1)として
PictureBox1とPictureBox2の両方を透過させようとしたものです。
ちなみにLabel1の親をPictureBox1にすると、
Label1がPictureBox2に隠れてしまって表示されません。
> PictureBox1とPictureBox2の両方のImageを設定して、
> (PictureBox2の画像はMicrosoft Photo Editorで透過性50%で透過したもの)
> PictureBox1を一番下、その上にPictureBox2、さらに上にLabel1を配置し、
> Label1はBackColor=Transparent・PictureBox2.Controls.Add(Label1)として
> PictureBox1とPictureBox2の両方を透過させようとしたものです。

Labelの背景を上記のようにふたつのPictureBoxを透過させると
おそらくフォームの”地”が見えることになると思いますが、
そういうことですか?それならば、親はフォームということになります。

>Label1のバックは(透過はするのですが)PB2の左上のところから(PB1の透過された画像)になってしまいます。どうすればうまく表示できるのでしょうか。

この意味がよくわかりません。”うまく”とはどうなればいいのでしょうか?
やはり言葉だけでは伝えるのが難しいので、絵入りでまとめてみました。
http://gameroom.gi-ga.net/VB.html
DrawStringでPictureBox2の上に文字を書くというのも考えたのですが、
出来るだけラベルで表示したいので。
何かいい方法はありませんでしょうか。よろしくお願いします。
解決ではありませんが、僕も似た様なところでつまずいているので。。。
LabelのBackColorのParentですが、これあんまり信用置けないような気がします。
僕の場合、ボタンなどのコントロールをラベルとParentにサンドするような形で張って見ましたが、間にあるはずのボタンははさまれた部分が表示されませんでした。
おそらくはParentは背景のBackgroundをBitBltする程度の働きではないでしょうか。
そしてどこでParentが認識されるかという点でこれは予測ですがおそらくControls.Add時かなと思います。(ところで、Koheiさん ラベルのコントロールAdd先Picture2になってますが。。。)Controls.Add時にParentによって背景がコピーされるなら、その後移動したときにはコピーされないんじゃないかと予測して見ます。先輩諸氏間違ってたら訂正してください。
2005/04/06(Wed) 22:06:40 編集(投稿者)

> DrawStringでPictureBox2の上に文字を書くというのも考えたのですが、
> 出来るだけラベルで表示したいので。
> 何かいい方法はありませんでしょうか。よろしくお願いします。

一応当方でも現象を実験してみましたが、そのようなことは確認
できませんでした。正常に表示されているようです。
参考までにプロジェクトファイルをUPしておきます。
http://members.at.infoseek.co.jp/ant_009/CompressedFiles/Other/TransparentLabelSample.zip
#VB.NETのバージョンは2003でしょうか?

>Controls.Add時にParentによって背景がコピーされるなら、その後移動したときにはコピーされないんじゃないかと

いえ、そのようなことはないと思います。
WM_PAINTが送られてくる度にPaintTransparentBackground
という内部メソッドで背景を描画しているようです。
> #VB.NETのバージョンは2003でしょうか?
いえ、2002です。
確かにexeファイルを見たところ普通に表示されていました。
2003の方でしか無理なのでしょうか?
確かにずれませんね。
>WM_PAINTが送られてくる度にPaintTransparentBackground
>という内部メソッドで背景を描画しているようです。
そうでしたか、ちなみに現在私もここで苦しんでます。w

WM_Paint時に再描画は、もらったプロジェクトに以下のロジックを追加して確認しました。(てか、これは、どぼんさんのロジックいじっただけですけど)

'マウスのクリック位置を記憶
Private mousePoint As Point

'マウスのボタンが押されたとき
Private Sub HandlerMouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Label1.MouseDown, PictureBox2.MouseDown
If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
'位置を記憶する
mousePoint = New Point(-e.X, -e.Y)
End If
End Sub

'マウスが動いたとき
Private Sub HandlerMouseMove(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Label1.MouseMove, PictureBox2.MouseMove
If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
sender.SetBounds( _
sender.Left + mousePoint.X + e.X, _
sender.Top + mousePoint.Y + e.Y, sender.Width, sender.Height)
End If
End Sub

2002ではどういう動きしますかねえ。それによってなんとなくわかると思うけど
> 2002ではどういう動きしますかねえ。それによってなんとなくわかると思うけど
載せていただいたコードをそのまま入れて
試してみたところ、やはりずれたままで動きました。
というか、動かすとパソコン本体のほうで
「シュルシュルシュル」という怪しげな音が聞こえてくるんですが・・・(汗
これは私のパソコンの方に何か問題があるのでしょうか・・・?
うーんどうにも2002なのか。OSなのかという点については答えられないです。
Parentをお使いということは、BitBltの荒業では解決といいがたいでしょうし。。

コントロールを動かすようにしてわかることは
システム内のOnPaintでの動作は発生しているかという点ですが、再描画もやっているようです。
位置が変わらないとしたら Antさんがおっしゃってた
PaintTransparentBackgroundの内部メソッドあたりが怪しいと思いますが、怪しいとしても解決策が見当たりません。すいません。
Parentに設定したときの動作は私のほうでもたまにおかしな動きをしますので、非常にグレーな気はしますけど。。。
  • 題名: Re[10]: Labelの透過について
  • 著者: kohei
  • 日時: 2005/04/07 18:48:40
  • ID: 10311
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
お答えくださってありがとうございます。
とりあえず、2003なら大丈夫っぽいということが分かったので、
いい機会だと思ったので2003を買おうと思います。
(今ならthe Spoken Premiumがあってすごい安いですし
実は解決してないような気もしますが(汗、
とりあえずこれで解決とさせていただきます。
何度もお答えいただきありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板