C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ラベルの透過について


(過去ログ 37 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■19401 / inTopicNo.1)  ラベルの透過について
  
□投稿者/ スバル (1回)-(2008/05/22(Thu) 19:02:36)

分類:[VB.NET/VB2005] 

VB 2005です。
よろしくお願いします。

ラベルの透過について困っています。

フォームをグラデーションで塗りつぶし、その上にラベルを置いています。
ラベルはBackColorがTransparent、FlatStyleがStandardとなっています。

フォームのPaintイベントは以下のような記述になっています。

Dim g As Graphics = Me.CreateGraphics()

Dim gp As New GraphicsPath
gp.AddRectangle(g.VisibleClipBounds)

Dim gb As New PathGradientBrush(gp)
gb.CenterColor = Color.White
gb.SurroundColors = New Color() {Color.Yellow, Color.Green, Color.Blue, Color.Red}
g.FillRectangle(gb, g.VisibleClipBounds)
gb.Dispose()
g.Dispose()

Me.Controls.Add(Label2)
Label2.Top = Label2.Top - Me.Top
Label2.Left = Label2.Left

参考:
http://dobon.net/vb/dotnet/graphics/lineargradientbrush.html
http://dobon.net/vb/dotnet/control/labelonpicturebox.html

以上、よろしくお願いします。

引用返信 編集キー/
■19403 / inTopicNo.2)  Re[1]: ラベルの透過について
□投稿者/ 鶏唐揚 (154回)-(2008/05/22(Thu) 19:15:58)
No19401 (スバル さん) に返信
> VB 2005です。
> よろしくお願いします。
>
> ラベルの透過について困っています。
>
> フォームをグラデーションで塗りつぶし、その上にラベルを置いています。
> ラベルはBackColorがTransparent、FlatStyleがStandardとなっています。
>
> フォームのPaintイベントは以下のような記述になっています。
>

> 参考:
> http://dobon.net/vb/dotnet/graphics/lineargradientbrush.html
> http://dobon.net/vb/dotnet/control/labelonpicturebox.html
>
> 以上、よろしくお願いします。
>
上記質問からは、「何に困っているか」が読み取れません。
「透過されない」といいたいのでしょうか?
引用返信 編集キー/
■19405 / inTopicNo.3)  Re[2]: ラベルの透過について
□投稿者/ スバル (2回)-(2008/05/22(Thu) 19:40:50)
No19403 (鶏唐揚 さん) に返信

お返事有難うございます。

すいません、読み返してみて自分で愚かだと思いました。

フォームの元の色が透過で見えていて、グラデーションが見えない状態です。

つまり、例えばフォームのBackColorが灰色の場合、一見してグラデーションがかかっていても、ラベルの背景色が灰色に見えてしまい透過しているように見えないのです。

すいません、上手く説明できませんがご理解いただけますでしょうか?
引用返信 編集キー/
■19421 / inTopicNo.4)  Re[3]: ラベルの透過について
□投稿者/ やじゅ (395回)-(2008/05/22(Thu) 21:35:50)
やじゅ さんの Web サイト
No19405 (スバル さん) に返信
> フォームの元の色が透過で見えていて、グラデーションが見えない状態です。
>

フォームに直接描画ではなく、PictureBoxに描画するようにした上で
Labelの親コントロールをPictureBoxにすればいいのでは?
引用返信 編集キー/
■19425 / inTopicNo.5)  Re[1]: ラベルの透過について
□投稿者/ Azulean (118回)-(2008/05/22(Thu) 22:42:21)
> Dim g As Graphics = Me.CreateGraphics()
これがそもそもの間違いです。
Paintイベントの引数のeにGraphicsプロパティがあるので、そちらに描画するようにして下さい。


しかし、これをしても、望んだとおりの透過にはならなさそうな感じがしますね。
引用返信 編集キー/
■19444 / inTopicNo.6)  Re[2]: ラベルの透過について
□投稿者/ 鶏唐揚 (156回)-(2008/05/23(Fri) 09:21:13)
2008/05/23(Fri) 09:25:45 編集(投稿者)

No19425 (Azulean さん) に返信
>>Dim g As Graphics = Me.CreateGraphics()
> これがそもそもの間違いです。
> Paintイベントの引数のeにGraphicsプロパティがあるので、そちらに描画するようにして下さい。
>
>
> しかし、これをしても、望んだとおりの透過にはならなさそうな感じがしますね。
いえ、Azuleanさんビンゴです。

CreateGraphicsはCreateという名の通り、新しくグラフィックスインスタンスを作ります。
一応生成元と繋がってるので、そのグラフィックスで描画しても正常に画面に反映されます。
が、VB.NETのラベルの「透過」は親の元のグラフィックスを自分自身にも描画するという形をとってるようなので
CreateGraphicsで新しく作られたグラフィックスはシカトしてるようです。

親の元グラフィックスであるPaintイベントの引数eを使うことで解決できます

#感覚的には、画像処理ソフトの「レイヤー」みたいなものかな。
 CreateGraphicsはレイヤの追加で、ラベルは「背景レイヤー」しか見てないと。

引用返信 編集キー/
■19449 / inTopicNo.7)  Re[3]: ラベルの透過について
□投稿者/ スバル (3回)-(2008/05/23(Fri) 10:22:48)
No19444 (やじゅ さん・Azulean さん・鶏唐揚 さん) に返信

皆様、お返事ありがとうございます。

Dim g As Graphics = Me.CreateGraphics()

Dim g As Graphics = e.Graphics()

とした所、ラベルの背景にグラデーションはかかったのですが…
上手く説明できないのですが、「透過してる」というよりは「同じグラデーションをかけている」といった感じで不自然になっています。

つまり、フォームが青→赤というグラデーションの真ん中にラベルを置いた場合、フォームの真ん中は紫っぽくなっているのにラベルの背景は青→赤のグラデーションがかかっている状態です。

…すいません、凄く意味不明な文章になってしまいましたが、これ以上は上手く説明できません。
引用返信 編集キー/
■19454 / inTopicNo.8)  Re[4]: ラベルの透過について
□投稿者/ 鶏唐揚 (158回)-(2008/05/23(Fri) 11:08:55)
2008/05/23(Fri) 11:25:02 編集(投稿者)

No19449 (スバル さん) に返信
> ■No19444 (やじゅ さん・Azulean さん・鶏唐揚 さん) に返信
>
> 皆様、お返事ありがとうございます。
>
> Dim g As Graphics = Me.CreateGraphics()
> を
> Dim g As Graphics = e.Graphics()
>
> とした所、ラベルの背景にグラデーションはかかったのですが…
> 上手く説明できないのですが、「透過してる」というよりは「同じグラデーションをかけている」といった感じで不自然になっています。
>
> つまり、フォームが青→赤というグラデーションの真ん中にラベルを置いた場合、フォームの真ん中は紫っぽくなっているのにラベルの背景は青→赤のグラデーションがかかっている状態です。
>
> …すいません、凄く意味不明な文章になってしまいましたが、これ以上は上手く説明できません。
g.VisibleClipBounds が原因かもしれない…

回避策としては、g.VisibleClipBoundsの部分をsender.ClientRectangleに変えてください
引用返信 編集キー/
■19456 / inTopicNo.9)  Re[5]: ラベルの透過について
□投稿者/ スバル (4回)-(2008/05/23(Fri) 11:36:47)
No19454 (鶏唐揚 さん) に返信
> 回避策としては、g.VisibleClipBoundsの部分をsender.ClientRectangleに変えてください

上手く表示されました!

有難うございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -