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

ピクチャーボックスにラベルを重ねた時のこと

環境/言語:[Windows7 VB2008]
分類:[.NET]

前回、円グラデーションの質問をしました。
今回はそのピクチャーボックスの上にラベルをかさねました。

picturebox1.controls.add(label1)
label1.location = new point(0,0)
としました。
タイマーを使用し時間で
ピクチャーボックスに円を描画したり再描画したりしています。
ただ上にラベルをおき、バックカラーをTransparencyにしても
ピクチャーボックスに描画された絵が表示されません。
ラベルの設定の仕方がいけないのでしょうか?
教えてください。
ラベルのtextプロパティには文字列が設定されています。
もし、CreateGraphics を使っているのであれば、Paint イベントを使う方向で考えてください。
ラベルなどの背景透過はあくまで、親のコントロールの Paint イベントの呼び出すだけであり、Paint イベントを使わない描画方法には無力です。
■No30187に返信(dropitem92さんの記事)
> ただ上にラベルをおき、バックカラーをTransparencyにしても
> ピクチャーボックスに描画された絵が表示されません。

描画した絵を、BackgroundImage や Image に配置しておくと表示されるかと。


Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Threading
Imports System.Windows.Forms

Partial Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        PictureBox1.Controls.Add(Label1)
        Label1.BackColor = Color.Transparent
        Label1.Location = New Point(5, 5)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Static r As Integer = Now.Minute * 256 \ 60
        Static g As Integer = Now.Second * 256 \ 60
        Static b As Integer = Now.Millisecond * 256 \ 1000
        Label1.Text = Now.ToString("HH:mm:ss.ffff")

        Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Using gr As Graphics = Graphics.FromImage(bmp), pa As New GraphicsPath()
            gr.Clear(Color.White)
            pa.AddEllipse(10, 10, 200, 100)
            Using br As New PathGradientBrush(pa)
                br.CenterColor = Color.FromArgb(r, g, b)
                r = Now.Millisecond * 256 \ 1000
                g = Now.Second * 256 \ 60
                b = Now.Minute * 256 \ 60
                br.SurroundColors = New Color() {Color.FromArgb(r, g, b)}
                gr.FillPath(br, pa)
            End Using
        End Using

        Dim oldImg As Image = Interlocked.Exchange(PictureBox1.Image, bmp)
        If oldImg IsNot Nothing Then
            oldImg.Dispose()
        End If
    End Sub
End Class



こちらは Paint イベントで実装してみた場合。
ラベルの下の楕円はグラデーションがかからず、単一色で塗られてしまう…?


Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Threading
Imports System.Windows.Forms

Partial Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        PictureBox1.Controls.Add(Label1)
        Label1.BackColor = Color.Transparent
        Label1.Location = New Point(5, 5)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        PictureBox1.Refresh()   'Invalidateでも可
        Label1.Text = Now.ToString("HH:mm:ss.ffff")
    End Sub

    Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
        Static r As Integer = Now.Minute * 256 \ 60
        Static g As Integer = Now.Second * 256 \ 60
        Static b As Integer = Now.Millisecond * 256 \ 1000

        Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Using pa As New GraphicsPath()
            e.Graphics.Clear(Color.White)
            pa.AddEllipse(10, 10, 200, 100)
            Using br As New PathGradientBrush(pa)
                br.CenterColor = Color.FromArgb(r, g, b)
                r = Now.Millisecond * 256 \ 1000
                g = Now.Second * 256 \ 60
                b = Now.Minute * 256 \ 60
                br.SurroundColors = New Color() {Color.FromArgb(r, g, b)}
                e.Graphics.FillPath(br, pa)
            End Using
        End Using
    End Sub
End Class
お二人ともありがとうございます。
描画した絵を、BackgroundImage や Image に配置しておく方法を試しましたが、
周りが白一色で塗られてしまいました。
また、その他13個の描画処理をしているのでメモリ不足と出てしまい
実用できませんでした。
解決済み!
2012/04/02(Mon) 09:14:08 編集(投稿者)

■No30191に返信(dropitem92さんの記事)
> また、その他13個の描画処理をしているのでメモリ不足と出てしまい
> 実用できませんでした。

透過ラベルの代わりに、文字列を描画することで代用すれば良いかと。
解決済み!
ありがとうございます。
最初は文字の描画の方法を考えていたのですが、
描画の間隔が狭いため文字がチラついてしまうので、
他の方法を考えました。
> 最初は文字の描画の方法を考えていたのですが、
> 描画の間隔が狭いため文字がチラついてしまうので、
> 他の方法を考えました。

文字がチラついてしまうというのがどういうことなのか分かりませんが、文字間隔が狭いのであれば、
原始的な思考ですが、一文字ずつ描画してはどうでしょう。

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