tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル透過したラベルのイベントをとりたい
記事No10808
投稿日: 2012/05/17(Thu) 09:32
投稿者かず
ラベルを2枚重ねて一枚のラベルを透過にして透過した方のmousemoveイベントを取りたいのですがイベントがとれません。お知恵を拝借願います。

今こんな漢字にしてます。
Label.Parent = Label1
Label.BackColor = Color.Transparent

環境
VS2005 winXP

[ツリー表示へ]
タイトルRe: 透過したラベルのイベントをとりたい
記事No10809
投稿日: 2012/05/17(Thu) 10:18
投稿者魔界の仮面弁士
Color.Transparent を指定したところで、背景画像が投下されるだけであって、
マウスイベントが透過されるわけではありません。

> お知恵を拝借願います。
手前のラベルコントロールでイベント処理するか、もしくはラベルそのものを使わずに
親コントロールに対して文字列を直接 DrawString することでラベルの代用とするとか。

[ツリー表示へ]
タイトルRe^2: 透過したラベルのイベントをとりたい
記事No10810
投稿日: 2012/05/17(Thu) 10:31
投稿者かず
> Color.Transparent を指定したところで、背景画像が投下されるだけであって、
> マウスイベントが透過されるわけではありません。
>
> > お知恵を拝借願います。
> 手前のラベルコントロールでイベント処理するか、もしくはラベルそのものを使わずに
> 親コントロールに対して文字列を直接 DrawString することでラベルの代用とするとか。
早速ありがとうございます。

Label.Parent = Label1
Label.BackColor = Color.Transparent
としてましてlabelのマウスイベントが発生しません。

やりたい事はlabelを透過にしてlabelの上をマウスが通過したとき、下のrabel1の背景色を変更したいのですが。ちなみにLabelの下にはlabel1からlabel40までコントロールがありそれぞれのコントロールの上をマウスが通過したときに背景を変更していきたいのですが。

説明がわかりずらいかもしれませんが再度お願いします。

[ツリー表示へ]
タイトルRe^3: 透過したラベルのイベントをとりたい
記事No10811
投稿日: 2012/05/17(Thu) 13:22
投稿者魔界の仮面弁士
> 説明がわかりずらいかもしれませんが
Label だったり label だったり
Label1 だったり label1 だったりと
表現が揺れすぎていて、正直、どれがどれだか分からないです。


> Label.Parent = Label1
> Label.BackColor = Color.Transparent
> としてましてlabelのマウスイベントが発生しません。

Label と label の違いが分からないので質問文を読みかえますが、上記は

| Label0.Parent = Label1
| Label0.BackColor = Color.Transparent
| としてまして Label0 のマウスイベントが発生しません。

という意味でしょうか? それとも、

| Label0.Parent = Label1
| Label0.BackColor = Color.Transparent
| としてまして Label1 のマウスイベントが発生しません。

の意味でしょうか。あるいは、

| Label0.Parent = Label1
| Label0.BackColor = Color.Transparent
| としてまして、ラベル(Label0 と Label1)のマウスイベントが発生しません。

という意味でしょうか?



> 再度お願いします。

再度同じことを書きますが、Color.Transparent を指定しようとしまいと、
マウス系イベントの動作には影響しません。

また、背景透過のために Parent で親子関係にしてあるようですが、
それぞれのラベルが親子関係だろうと、重ねて配置してあるだけの場合であろうと、
MouseMove が通知されるのは、あくまでも一番手前のラベルということです。
http://www.vb-user.net/junk/replySamples/2012.05.17.12.46/VBrescue_net10808.png


たとえ「奥(下に敷かれているコントロール)」がイベントを受け取れずとも、
「手前(上に載せてあるコントロール)」はイベントを受けとれるはずです。

どちらか一方でもマウス操作を検出できれば、あとはマウス座標を調べることで
処理対象のコントロールを割り出すことは可能かと思いますよ。


> Labelの下にはlabel1からlabel40までコントロールがあり

ラベルを重ねて配置しているのではなく、Parent で親子関係を持たせているのですよね。
ここでいう 上/下 という表現は、画面の奥側と手前側、どちらを指していますか?


今回の質問文から、私は

 ・[Label] の上に label1〜label40 を載せてあるのではなく、
  [Label] の下に label1〜label40 を敷いてある。

 ・イベントが取れないのは(label1〜label40ではなく)、[Label] の方である。

と読み取ったのですが、どうにも状況を想像できずにいます。


最初(No.10808)の質問を見たときには、

Form1
┗[Label] (親)
 ┣label1 (子1)
 ┣label2 (子2)
 : :
 ┗labelX (子X)

のような関係を想像しましたが、今回(No.10810)の質問文からは、
親子関係が逆であるように読み取れたため、下記のような画面を
想像したのですが――これもなんだか違いそうですね。

Form1
┣label1 (親1)
┃┣[Label] (1-1)
┃┣[Label] (1-2)
: :
┃┗[Label] (1-n)

┣label2 (親2)
┃┣[Label] (2-1)
┃┣[Label] (2-2)
: :
┃┗[Label] (2-n)

┗label40(親40)
 ┣[Label] (40-1)
 ┣[Label] (40-2)
  :
 ┗[Label] (40-n)

[ツリー表示へ]
タイトルRe^4: 透過したラベルのイベントをとりたい
記事No10813
投稿日: 2012/05/17(Thu) 17:02
投稿者かず
わかりにくい説明に丁寧に解釈して説明頂きありがとうございました。

大変申し訳ありません。

イベントがとれないと記載しておりましたが再度確認しましたらイベントはとれて下の色も変更されてました親ラベルを Color.Transparentで透明にしており子の色を変更しても親に隠れて色が表示されてなかったように見えてただけでした。

よく確認してなくて申し訳ありませんでした。

質問の内容が変わってしまいますが上記の場合に子の色を表に出すことは可能でしょうか?

[ツリー表示へ]
タイトルRe^5: 透過したラベルのイベントをとりたい
記事No10814
投稿日: 2012/05/17(Thu) 18:22
投稿者魔界の仮面弁士
> わかりにくい説明に丁寧に解釈して説明頂きありがとうございました。
結局、どのように解釈すれば良いのか曖昧なままだったり…。
雑談用掲示板の方に、画面イメージを説明用に貼ってもらえませんか?


> 親ラベルを Color.Transparentで透明にしており
最初の No10808 では、
 子Label.Parent = 親Label               '[子]の "親" として [親] を割当
 子Label.BackColor = Color.Transparent  '[子]の "背景色" を `透明` にする
と記述されていましたよね。

親ラベルを Transparent にしていたということは、
 子Label.Parent = 親Label
 子Label.BackColor = Color.Transparent
 親Label.BackColor = Color.Transparent   '親も子も透明
だったということですか?


> イベントはとれて下の色も変更されてました
「下の色」というのは、どれの色を指しているのでしょうか?


> 親ラベルを Color.Transparentで透明にしており
> 子の色を変更しても親に隠れて色が表示されてなかったように見えてただけでした。

未だに分からないので、再度整理。
質問内容を想像で補っているので、差異があったら訂正してください。


==============================================
【仮定1:現在の画面構成】
----------------------------------------------
[Form1]
┗[Label0] … 親ラベル
 ┣[Label1(Transparent)] … 子ラベル
 ┣[Label2(Transparent)] … 子ラベル
 :
 ┗[Label40(Transparent)] … 子ラベル

Label1.Parent = Label0
Label1.BackColor = Color.Transparent
Label2.Parent = Label0
Label2.BackColor = Color.Transparent
  :
Label40.Parent = Label0
Label40.BackColor = Color.Transparent


==============================================
【仮定2:現在の状況】
----------------------------------------------
> 再度確認しましたらイベントはとれて
・子ラベル(画面手前側のラベル)で、MouseMove イベントは受け取れていた。
・このイベントとは、上図でいうところの Label1〜Label40 のイベントである。

> 下の色も変更されてました
・その MouseMove で、子ラベルの「下」すなわち画面奥側にある何かの色を変更している。
 * Form1 の色を変えている?
 * 親ラベル(Label0) の色を変えている?
 * それ以外の何か?

> 親ラベルを Color.Transparentで透明にしており
・親ラベルは、子と同様に Transparent に設定されていた?
・子の MouseMove 中では、親ラベルの色は変更していない?
・変更したい色は、親ラベルのさらに親(Formなど)の色であるということか?

> 親に隠れて色が表示されてなかったように見えてた
・ここでいう「親に隠れた色」とは、何の事を指しているのか?
 * 親の下(画面の奥側)にあるコントロール(Form や Panel 等)の色のことか?
 * 親ラベルが Transparent なら、さらにその親(Form 等)の背景色も見えるはず…?


> 上記の場合に子の色を表に出すことは可能でしょうか?
子(最前面にあるラベル)は透明なので、そもそも色は無いのでは?
親コントロールの色がそのまま表示されるだけだと思いますけれども…。

[ツリー表示へ]
タイトルRe^6: 透過したラベルのイベントをとりたい
記事No10815
投稿日: 2012/05/17(Thu) 18:25
投稿者かず
本当すみません。

もう一度自分自身で整理してみます。

[ツリー表示へ]
タイトルRe^3: 透過したラベルのイベントをとりたい
記事No10812
投稿日: 2012/05/17(Thu) 14:18
投稿者shu
Label1〜40の上に配置してあるであろうラベルはイベントの取得以外に
意味があるのでしょうか?なければそんなラベルは配置せずに
Label1〜40にイベントを貼るようにした方がよいと思います。

例)
private labels() as Label
・・・
labels = new Label() {Label1, Label2, Label3, ... , Label40}

For Each lbl as Label in labels
    AddHandler lbl.MouseMove, AddressOf lbl_MouseMove
Next
・・・


Private Sub lbl_MouseMove(sender,e)    '<--実際にはAs型を書いて下さい。
    For Each lbl2 as Label in labels
        If lbl2 is sender then
        lbl2.BackColor = ・・・
        Else
        lbl2.BackColor = ・・・
        End If
    Next
End Sub

といった感じ。必要に応じ他のMouseイベントもAddHandlerするとよいと思います。

[ツリー表示へ]