VisualBasicのボタンのBackColorがBLACK、ForeColorがWHITEを設定し、EbabledをFalseにしたとき、文字の色が黒くなる。

栗原 敬 20 評価のポイント
2026-10-28T04:24:27.8766667+00:00

VisualBasicのボタンのBackColorがBLACK、ForeColorがWHITEを設定し、EbabledをFalseにしたとき、文字の色が黒くなる。

EnabledをFalseにしたとき、文字色は淡い色になる仕様と認識していたが、異なる。

BackColorがWHITEの場合、濃いグレーとなり、淡い色になったので正しく動作している。EbabledをFalseにしたとき、文字の色は背景色に影響されるのか、確認したい。

Windows での開発 | インターネット インフォメーション サービス
0 件のコメント コメントはありません

質問作成者が受け入れた回答
gekka 14,636 評価のポイント MVP ボランティア モデレーター
2026-10-28T17:38:13.56+00:00

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

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "推奨" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。