Text color of disabled control - how to change it

42,539

Solution 1

Way simpler than trying to change the way Windows draws disabled controls is to simply set a flag when you want the Label to be effectively "disabled", and then check the value of that flag in your Click event handler method before taking whatever action you want. If the control has been "disabled", then don't take any action.

Something like this:

private bool labelDisabled = false;

private void myLabel_Click(object sender, EventArgs e)
{
    if (!labelDisabled)
    {
        this.ForeColor = SystemColors.ControlText;
    }
}

Also, note that you should always use the SystemColors instead of something like Color.Black.
If you hard-code specific color values, they will often conflict when the user customizes their default Windows theme. Raymond Chen discusses the perils of this in an article on his blog.

Solution 2

Just create your own label with a redefined paint event:

protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
    if ( Enabled )
    {
        //use normal realization
        base.OnPaint (e);
        return;
    }
    //custom drawing
    using ( Brush aBrush = new SolidBrush( "YourCustomDisableColor" ) )
    {
        e.Graphics.DrawString( Text, Font, aBrush, ClientRectangle );
    }
}

Be careful with text format flags during text drawing.

Share:
42,539
Mqati
Author by

Mqati

Updated on July 17, 2022

Comments

  • Mqati
    Mqati almost 2 years

    During the creation of my awesome Matching Game ;) I found a problem that is completely out of reach.

    When the player chooses two labels with symbols on them I want to lock all the other labels for 4 seconds.

    But when I do that, the forecolor of all the labels changes to grey and the symbols are visible. My question is - is there a method to change the ForeColor of a disabled label in visual c#?

    The project is a WinForm application.

    At the moment I set the color of a label in code this way:

    label1.ForeColor = lable1.BackColor;
    

    When the user clicks the label I change it to:

    lable1.ForeColor = Color.Black;