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

プログレスバー上にテキストを表示

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

Windows フォームのプログレスバー上にテキストを表示したいと試行錯誤しています。

ラベルをプログレスバーに Controls.Add してみましたが、ラベルの背景が透過されませんでした。
プログレスバーに Graphics.DrawString も試しましたが再描画が多いため点滅したようになってしまします。

良い方法がありましたらよろしくお願いします。
2011/10/24(Mon) 22:56:48 編集(投稿者)

■No29290に返信(Yoshiさんの記事)
> Windows フォームのプログレスバー上にテキストを表示したいと試行錯誤しています。
>
> ラベルをプログレスバーに Controls.Add してみましたが、ラベルの背景が透過されませんでした。
> プログレスバーに Graphics.DrawString も試しましたが再描画が多いため点滅したようになってしまします。
>
> 良い方法がありましたらよろしくお願いします。
>

(追加:"ラベル 背景 透過"で検索すると該当記事見つかります。これで解決可能です。では、)

[codeproject]
***Progress-O-Doom***
http://www.codeproject.com/KB/progress/ProgressODoom.aspx

***Custom Control for Text Over a Progress Bar***
http://www.codeproject.com/KB/progress/TheBestProgressBarEver.aspx

***Fully Customizable XP Progress Bar (with examples)***
http://www.codeproject.com/KB/cpp/XpProgressBar.aspx

2番目辺りが簡単そうですね。

ちなみにMarqueeスタイルならGifアニメーションでやってしまうのも手です。(私は簡単で美しく作れるのでgifアニメばかりで代用しています。)
例えばよくあるリングプログレスバーならphotoshopで作成すれば簡単なもので約15分、色使いにこだわったとしても1時間ほどでできます。そしてデザインが気に入らないならgifアニメを変えるだけですみます。独自デザインでやる場合はかなり楽です。

あとは地道にバックバッファ用のBitmapを用意しパネルか何かに塗ってプログレスバーみたいなものを作るという形になるんですかね...。

以上、参考までに。
こんなんでどう?
文字列描画部分は希望にあわせて修正してください。

Public Class ProgressText
    Inherits ProgressBar

    Public Sub New()
        MyBase.new()
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    End Sub

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim grp = e.Graphics()

        Dim rect1 = Me.ClientRectangle
        Dim rect2 As New Rectangle(rect1.X + 3, _
            rect1.Y + 3, CInt((rect1.Width - 6) * Value / Maximum), rect1.Height - 6)
        ProgressBarRenderer.DrawHorizontalBar(grp, rect1)
        ProgressBarRenderer.DrawHorizontalChunks(grp, rect2)


        grp.DrawString("あああああ", Me.Font, Brushes.White, rect1, New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center})
    End Sub
End Class

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