C# 按钮派生的自定义控件的背景/边框

C# 按钮派生的自定义控件的背景/边框,c#,winforms,button,background,border,C#,Winforms,Button,Background,Border,我有一个来自按钮的CustomControl。在该控件生命周期的某些时刻,我想将其背景设置为一种特殊颜色(即梅花色)或一种普通控件颜色(即与其他按钮的默认颜色相同)。以下是最有效的相关代码 public partial class MySpecialButton : Button { private void SetButtonState() { if (isSpecial && Enabled) { Bac

我有一个来自按钮的CustomControl。在该控件生命周期的某些时刻,我想将其背景设置为一种特殊颜色(即梅花色)或一种普通控件颜色(即与其他按钮的默认颜色相同)。以下是最有效的相关代码

public partial class MySpecialButton : Button
{
    private void SetButtonState()
    {
        if (isSpecial && Enabled)
        {
            BackColor = Color.Plum;
        }
        else
        {
            BackColor = Enabled ? SystemColors.Control : SystemColors.ControlDark;
        }
    }
}
这有几个问题:

  • 当“我的控件”处于启用状态且未处于特殊模式时,与其他按钮相比,按钮绘制时使用的控件颜色似乎太浅。您可以在下图中看到这一点,“创建默认”按钮是具有默认颜色的普通按钮,“从设备读取”按钮是背景颜色设置为SystemColor.Control的我的特殊按钮。为什么这两种颜色不同?

  • 当我的控件使用上面的代码以任何背景颜色绘制时,按钮周围似乎有一个边框,这是我不想要的。例如,在上图中,“从设备读取”按钮有一个相当厚的边框,似乎是控件颜色

  • 使用基础按钮绘制控件时。Enabled=false,颜色与禁用按钮的默认颜色不同。你可以在下图中看到这一点。与“保存到计算机”按钮相比,“写入设备”控件的颜色太暗,两者都已启用=false。

  • 禁用的控件具有错误的前景文本颜色。如何利用基类的机制正确绘制文本/背景/边框等
  • 考虑以下注意事项:

  • 按钮的
    BackColor
    属性设置为
    use visualstylebackcolor
    会导致设置
    use visualstylebackcolor
    false
    ,而您看到的普通按钮和自定义按钮之间的差异正是由于此。要解决此问题,应在将
    BackColor
    重置为
    SystemColors.Control
    后,再次将
    UseVisualStyleBackColor
    设置为true

  • 如果您不喜欢该边框,请自己绘制按钮,或使用
    FlatStyle
    设置为
    Flat
    ,然后使用
    FlatAppearance.BorderSize=0
    或您喜欢的任何其他外观和边框大小

  • 和第一名一样

  • 禁用的
    按钮的前景色根据背景色计算。因此,如果您按照第一条中所述重置背景颜色,您将看不到任何差异