ProgressBar中央にテキストを表示したい

タグの編集
投稿者 おおぎっち  (社会人) 投稿日時 2009/9/20 04:40:42
題名の通りなのですが、ProgressBar中央にテキストを表示したいのです。
何%かを中央に表示するような感じです。

ラベルを貼り付けてみてもラベルの背景色が邪魔でテキストだけを表示することはできませんでしたし
MSDNを参考にしてみてもできませんでした。

表示方法をよろしくお願いいたします。
投稿者 太郎冠者  (社会人) 投稿日時 2009/9/20 08:35:58
ラベルの背景色が邪魔ならば背景色を透過すればOKだと思います。
[参考-ラベルの背景を透過する]
http://youryella.wankuma.com/Library/Extensions/Label/Transparent.aspx
投稿者 おおぎっち  (社会人) 投稿日時 2009/9/20 09:11:03
早速ありがとうございます。
書き忘れていましたがやってみました。

それでもなぜかプログレスバーの上にラベルを載せると透過されませんでした。
投稿者 太郎冠者  (社会人) 投稿日時 2009/9/20 10:52:31
そうですか?
当方の環境(WindowsXP SP3,VisualStudio2008Pro)で上気サイト内のサンプル(ラベルのカスタムコントロール)を丸コピして確認しましたが問題無く透過されていました。

[確認手順]
①上記サイト内のLabelコントロールの背景を透過するサンプルをコピペ & ビルド
②Form上に①で作成したTransparentLabelとProgressBarとTimerコントロールを配置
③デザイナでTransparentLabelのBackCokorをColor.Transparentに設定
④同じくデザイナでTimerのEnabledをTrueに設定
④TimerのTickイベント内に適当にProgressBarのValueを変更する処理を記述
⑤実行

何か処理に違いがあるのかも知れません。
お手数ですが透過されなかった時の処理・操作内容を教えて頂けませんか?

また、念のため補足しますが提示サイト内にもあるように、デザイナ上ではラベルの背景は透過されませんのでご注意ください。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/9/20 19:52:21
> 丸コピして確認しましたが問題無く透過されていました。
私のところでは、少し問題が出ました。

透明になってはいるのですが、ClearType/TrueType フォント周辺のアンチエイリアスが
うまく処理されないので、Font によっては元の文字がつぶれてしまう事もあるようです。


別案。% 付きのプログレスバーそのものを自作してみました。

System.Windows.Forms.ProgressBar コントロールをそのまま使う代わりに、
素のコントロールに System.Windows.Forms.ProgressBarRenderer で
プログレスバーを描画しています。

# System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar でも良いですが。

'--- CustomProgressBar.vb --- 
Imports System.ComponentModel

<DefaultEvent("ValueChanged"), DefaultProperty("Value")> _
Public Class CustomProgressBar
    Inherits Control
    Private _Maximum As Integer = 100
    Private _Minimum As Integer = 0
    Private _Value As Integer = 0
    Public Event ValueChanged As EventHandler

    Public Sub New()
        MyBase.AutoSize = False
        MyBase.Text = "0%"
    End Sub

    <Browsable(False)> _
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Overrides Property Text() As String
        Get
            Return Nothing
        End Get
        Set(ByVal value As String)
        End Set
    End Property

    <DefaultValue(100)> _
    Public Property Maximum() As Integer
        Get
            Return _Maximum
        End Get
        Set(ByVal value As Integer)
            _Maximum = value
            If Me.Value > value Then
                Me.Value = value
            Else
                Me.Value = Me.Value
            End If
        End Set
    End Property

    <DefaultValue(0)> _
    Public Property Minimum() As Integer
        Get
            Return _Minimum
        End Get
        Set(ByVal value As Integer)
            _Minimum = value
            If Me.Value < value Then
                Me.Value = value
            Else
                Me.Value = Me.Value
            End If
        End Set
    End Property

    <DefaultValue(0)> _
    Public Property Value() As Integer
        Get
            Return _Value
        End Get
        Set(ByVal newValue As Integer)
            If newValue < Minimum OrElse Maximum < newValue Then
                Throw New ArgumentOutOfRangeException("Value", newValue, _
                    "'Value' は 'Minimum' と 'Maximum' の間でなければなりません。")
            End If
            _Value = newValue
            Invalidate()
            RaiseEvent ValueChanged(Me, EventArgs.Empty)
        End Set
    End Property

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
        Dim chunksRect As Rectangle = ClientRectangle
        chunksRect.Inflate(-3, -3)
        If (Maximum - Minimum) = 0 Then
            chunksRect.Width = 0
        Else
            Dim dbl As Double = (Value - Minimum) / (Maximum - Minimum)
            chunksRect.Width = CInt(chunksRect.Width * dbl)
        End If
        Dim Caption As String = "0%"
        If Value <> Minimum Then
            Dim dec As Decimal = CDec(Value - Minimum) / CDec(Maximum - Minimum)
            Caption = FormatPercent(dec, 0)
        End If
        ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle)
        ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, chunksRect)
        TextRenderer.DrawText(e.Graphics, Caption, Me.Font, ClientRectangle, Me.ForeColor)
    End Sub
End Class
投稿者 おおぎっち  (社会人) 投稿日時 2009/9/21 09:31:14
>>太郎冠者様
すみません、やったというのはラベルのBackColorプロパティをTransparentに設定しただけでした。

というかコードの使い方が全く分かりませんでした(笑)

そして少しいろいろとやってみましたがやっとできました!
コントロールを作る、と言うことだったんですね。ずっとプログラムのどこかに埋め込むのかと思っていました。



>>魔界の仮面弁士様 
こちらもためさせていただきました。
思い通りに動きました!



とりあえずどちらでもいけそうなので適当にしてみることにします

とても勉強になりました。ありがとうございました。