ProgressBar中央にテキストを表示したい への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2009/9/20 19:52:21
> 丸コピして確認しましたが問題無く透過されていました。
私のところでは、少し問題が出ました。
透明になってはいるのですが、ClearType/TrueType フォント周辺のアンチエイリアスが
うまく処理されないので、Font によっては元の文字がつぶれてしまう事もあるようです。
別案。% 付きのプログレスバーそのものを自作してみました。
System.Windows.Forms.ProgressBar コントロールをそのまま使う代わりに、
素のコントロールに System.Windows.Forms.ProgressBarRenderer で
プログレスバーを描画しています。
# System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar でも良いですが。
私のところでは、少し問題が出ました。
透明になってはいるのですが、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/20 10:52:31
そうですか?
当方の環境(WindowsXP SP3,VisualStudio2008Pro)で上気サイト内のサンプル(ラベルのカスタムコントロール)を丸コピして確認しましたが問題無く透過されていました。
[確認手順]
①上記サイト内のLabelコントロールの背景を透過するサンプルをコピペ & ビルド
②Form上に①で作成したTransparentLabelとProgressBarとTimerコントロールを配置
③デザイナでTransparentLabelのBackCokorをColor.Transparentに設定
④同じくデザイナでTimerのEnabledをTrueに設定
④TimerのTickイベント内に適当にProgressBarのValueを変更する処理を記述
⑤実行
何か処理に違いがあるのかも知れません。
お手数ですが透過されなかった時の処理・操作内容を教えて頂けませんか?
また、念のため補足しますが提示サイト内にもあるように、デザイナ上ではラベルの背景は透過されませんのでご注意ください。
当方の環境(WindowsXP SP3,VisualStudio2008Pro)で上気サイト内のサンプル(ラベルのカスタムコントロール)を丸コピして確認しましたが問題無く透過されていました。
[確認手順]
①上記サイト内のLabelコントロールの背景を透過するサンプルをコピペ & ビルド
②Form上に①で作成したTransparentLabelとProgressBarとTimerコントロールを配置
③デザイナでTransparentLabelのBackCokorをColor.Transparentに設定
④同じくデザイナでTimerのEnabledをTrueに設定
④TimerのTickイベント内に適当にProgressBarのValueを変更する処理を記述
⑤実行
何か処理に違いがあるのかも知れません。
お手数ですが透過されなかった時の処理・操作内容を教えて頂けませんか?
また、念のため補足しますが提示サイト内にもあるように、デザイナ上ではラベルの背景は透過されませんのでご注意ください。
投稿者 おおぎっち  (社会人)
投稿日時
2009/9/20 09:11:03
早速ありがとうございます。
書き忘れていましたがやってみました。
それでもなぜかプログレスバーの上にラベルを載せると透過されませんでした。
書き忘れていましたがやってみました。
それでもなぜかプログレスバーの上にラベルを載せると透過されませんでした。
投稿者 太郎冠者  (社会人)
投稿日時
2009/9/20 08:35:58
ラベルの背景色が邪魔ならば背景色を透過すればOKだと思います。
[参考-ラベルの背景を透過する]
http://youryella.wankuma.com/Library/Extensions/Label/Transparent.aspx
[参考-ラベルの背景を透過する]
http://youryella.wankuma.com/Library/Extensions/Label/Transparent.aspx
投稿者 おおぎっち  (社会人)
投稿日時
2009/9/20 04:40:42
題名の通りなのですが、ProgressBar中央にテキストを表示したいのです。
何%かを中央に表示するような感じです。
ラベルを貼り付けてみてもラベルの背景色が邪魔でテキストだけを表示することはできませんでしたし
MSDNを参考にしてみてもできませんでした。
表示方法をよろしくお願いいたします。
何%かを中央に表示するような感じです。
ラベルを貼り付けてみてもラベルの背景色が邪魔でテキストだけを表示することはできませんでしたし
MSDNを参考にしてみてもできませんでした。
表示方法をよろしくお願いいたします。
すみません、やったというのはラベルのBackColorプロパティをTransparentに設定しただけでした。
というかコードの使い方が全く分かりませんでした(笑)
そして少しいろいろとやってみましたがやっとできました!
コントロールを作る、と言うことだったんですね。ずっとプログラムのどこかに埋め込むのかと思っていました。
>>魔界の仮面弁士様
こちらもためさせていただきました。
思い通りに動きました!
とりあえずどちらでもいけそうなので適当にしてみることにします
とても勉強になりました。ありがとうございました。