Windows FormsのコントロールはOSの標準の方法で描画がされます。
このDisabledでの文字の描画方法は昔から変わらない挙動です。
(OSのバージョンやテーマで多少の違いはあるでしょうが)
ためしにBackColorを変えて文字の色がどうなるかを見てみると、
| BackColor | Disabledの時の文字色 |
|---|---|
| &HFFFFFFFF | &HFF000000 |
| &HFF808080 | &HFF482A2A |
| &HFF000000 | &HFF915555 |
のようにBackColorに応じた、およそ直線的に変化してました
気に入らない場合は、自分で文字を描画するしかありません。
Public Class Form1
Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
Dim btn As New Button()
AddHandler btn.EnabledChanged, AddressOf Button_EnabledChanged
AddHandler btn.Paint, AddressOf Button_Paint
AddHandler btn.TextChanged, AddressOf Button_TextChanged
btn.Text = "Test"
btn.Width = 200
btn.Height = 80
btn.Left = 20
btn.Top = 20
btn.Font = New Font(Me.Font.FontFamily, 30, FontStyle.Bold)
btn.BackColor = Color.Black
btn.ForeColor = Color.White
Me.Controls.Add(btn)
Me.Controls.SetChildIndex(btn, 0)
Dim timer = New Timer()
timer.Interval = 1000
AddHandler timer.Tick,
Sub(s, e)
btn.Enabled = Not btn.Enabled
End Sub
timer.Start()
End Sub
Private Sub Button_EnabledChanged(sender As Object, e As EventArgs) Handles Button1.EnabledChanged
Dim btn = DirectCast(sender, Button)
If btn.Enabled Then
If TypeOf btn.Tag Is String Then
btn.Text = btn.Tag
End If
Else
btn.Tag = btn.Text
btn.Text = vbNullChar
End If
End Sub
Private Sub Button_Paint(sender As Object, e As PaintEventArgs) Handles Button1.Paint
Dim btn As Button = sender
If Not btn.Enabled And TypeOf btn.Tag Is String Then
Dim text As String = btn.Tag
Using sf As StringFormat = New StringFormat()
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
Dim countChar As Integer
Dim countLine As Integer
Dim sz = e.Graphics.MeasureString(text, btn.Font, e.ClipRectangle.Size, sf, countChar, countLine)
TextRenderer.DrawText(e.Graphics, text.Substring(0, countChar), btn.Font, e.ClipRectangle, Color.LightGray, TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter)
End Using
End If
End Sub
Private Sub Button_TextChanged(sender As Object, e As EventArgs) Handles Button1.TextChanged
Dim btn As Button = sender
If btn.Enabled OrElse btn.Text = vbNullChar Then
Return
End If
btn.Tag = btn.Text
btn.Text = ""
End Sub
End Class