C# 高亮显示按钮而不更改文本、背景色、是否启用?

C# 高亮显示按钮而不更改文本、背景色、是否启用?,c#,winforms,button,C#,Winforms,Button,突出显示按钮的好方法是什么? 已使用或不允许使用: 不要更改按钮。文本(必须保留旧文本) 不要更改按钮。背景色(按钮已经非常丰富多彩) 不更改按钮。已启用(已使用但不够) 这个想法是要有一个类似RadioButton组的东西,只有普通的按钮。选中的按钮应该在眼角处很容易看到 我也有一些想法: 边框/底纹:从未使用过该选项,我也不知道如何更改默认按钮底纹或单个按钮的边框样式 字体(下划线) 图像(未尝试) 不久前我遇到了这个问题。以下解决方案高亮显示颜色,保留原始颜色。您可以使用它突出显示

突出显示按钮的好方法是什么?

已使用或不允许使用:

  • 不要更改
    按钮。文本
    (必须保留旧文本)
  • 不要更改按钮。背景色(按钮已经非常丰富多彩)
  • 不更改
    按钮。已启用
    (已使用但不够)

这个想法是要有一个类似RadioButton组的东西,只有普通的按钮。选中的按钮应该在眼角处很容易看到

我也有一些想法:

  • 边框/底纹:从未使用过该选项,我也不知道如何更改默认按钮底纹或单个按钮的边框样式
  • 字体(下划线)
  • 图像(未尝试)

不久前我遇到了这个问题。以下解决方案高亮显示颜色,保留原始颜色。您可以使用它突出显示按钮背面的颜色(但保留它)。否则,您应该拥有DrawYou按钮,并寻找一个好的机制来突出显示它(发光、边框等…)。希望能有帮助

public static Color HighLight(Color c)
{
    ColorRGB color = new ColorRGB(c);

    float newLValue = color.L;

    float highlightFactor = 0.25f; //from 0 to 1

    // change lightness
    if (color.L >= 0.5)
    {
        newLValue -= highlightFactor;
    }
    else
    {
        newLValue += highlightFactor;
    }

    ColorRGB highlighted = 
        FromHSLA(
        color.H, 
        color.S, 
        newLValue, 
        color.A);

    return Color.FromArgb(highlighted.A, highlighted.R, highlighted.G, highlighted.B);
}

public class ColorRGB
{
    public byte R;
    public byte G;
    public byte B;
    public byte A;

    public ColorRGB()
    {
        R = 255;
        G = 255;
        B = 255;
        A = 255;
    }

    public ColorRGB(Color value)
    {
        this.R = value.R;
        this.G = value.G;
        this.B = value.B;
        this.A = value.A;
    }
    public static implicit operator Color(ColorRGB rgb)
    {
        Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B);
        return c;
    }
    public static explicit operator ColorRGB(Color c)
    {
        return new ColorRGB(c);
    }


    // Given H,S,L in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSL(double H, double S, double L)
    {
        return FromHSLA(H, S, L, 1.0);
    }

    // Given H,S,L,A in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSLA(double H, double S, double L, double A)
    {
        double v;
        double r, g, b;
        if (A > 1.0)
            A = 1.0;

        r = L;   // default to gray
        g = L;
        b = L;
        v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S);
        if (v > 0)
        {
            double m;
            double sv;
            int sextant;
            double fract, vsf, mid1, mid2;

            m = L + L - v;
            sv = (v - m) / v;
            H *= 6.0;
            sextant = (int)H;
            fract = H - sextant;
            vsf = v * sv * fract;
            mid1 = m + vsf;
            mid2 = v - vsf;
            switch (sextant)
            {
                case 0:
                    r = v;
                    g = mid1;
                    b = m;
                    break;
                case 1:
                    r = mid2;
                    g = v;
                    b = m;
                    break;
                case 2:
                    r = m;
                    g = v;
                    b = mid1;
                    break;
                case 3:
                    r = m;
                    g = mid2;
                    b = v;
                    break;
                case 4:
                    r = mid1;
                    g = m;
                    b = v;
                    break;
                case 5:
                    r = v;
                    g = m;
                    b = mid2;
                    break;
            }
        }
        ColorRGB rgb = new ColorRGB();
        rgb.R = Convert.ToByte(r * 255.0f);
        rgb.G = Convert.ToByte(g * 255.0f);
        rgb.B = Convert.ToByte(b * 255.0f);
        rgb.A = Convert.ToByte(A * 255.0f);
        return rgb;
    }

    // Hue in range from 0.0 to 1.0
    public float H
    {
        get
        {
            // Use System.Drawing.Color.GetHue, but divide by 360.0F 
            // because System.Drawing.Color returns hue in degrees (0 - 360)
            // rather than a number between 0 and 1.
            return ((Color)this).GetHue() / 360.0F;
        }
    }

    // Saturation in range 0.0 - 1.0
    public float S
    {
        get
        {
            return ((Color)this).GetSaturation();
        }
    }

    // Lightness in range 0.0 - 1.0
    public float L
    {
        get
        {
            return ((Color)this).GetBrightness();
        }
    }
}
公共静态颜色高亮显示(c色)
{
ColorRGB color=新的ColorRGB(c);
float newLValue=color.L;
float highlightFactor=0.25f;//从0到1
//变光
如果(颜色L>=0.5)
{
newLValue-=高光系数;
}
其他的
{
newLValue+=高亮度因子;
}
彩色RGB高亮显示=
弗罗姆斯拉(
颜色,
颜色,
新左值,
颜色(A);
返回Color.FromArgb(高亮显示的.A、高亮显示的.R、高亮显示的.G、高亮显示的.B);
}
公共类彩色RGB
{
公共字节R;
公共字节G;
公共字节B;
公共字节A;
公共颜色RGB()
{
R=255;
G=255;
B=255;
A=255;
}
公共颜色RGB(颜色值)
{
这个.R=值.R;
这个.G=值.G;
这个.B=值.B;
此.A=值.A;
}
公共静态隐式运算符颜色(ColorRGB rgb)
{
Color c=Color.FromArgb(rgb.A、rgb.R、rgb.G、rgb.B);
返回c;
}
公共静态显式运算符ColorRGB(颜色c)
{
返回新颜色RGB(c);
}
//给定0-1范围内的H、S、L
//返回0-255范围内的颜色(RGB结构)
HSL的公共静态颜色RGB(双H、双S、双L)
{
从HSLA返回(H、S、L、1.0);
}
//给定0-1范围内的H、S、L、A
//返回0-255范围内的颜色(RGB结构)
来自HSLA的公共静态颜色RGB(双H、双S、双L、双A)
{
双v;
双r,g,b;
如果(A>1.0)
A=1.0;
r=L;//默认为灰色
g=L;
b=L;
v=(l0)
{
双m;
双sv;
国际六分仪;
双分形,vsf,mid1,mid2;
m=L+L-v;
sv=(v-m)/v;
H*=6.0;
六分仪=(int)H;
fract=H-六分仪;
vsf=v*sv*fract;
mid1=m+vsf;
mid2=v-vsf;
开关(六分仪)
{
案例0:
r=v;
g=mid1;
b=m;
打破
案例1:
r=mid2;
g=v;
b=m;
打破
案例2:
r=m;
g=v;
b=mid1;
打破
案例3:
r=m;
g=mid2;
b=v;
打破
案例4:
r=mid1;
g=m;
b=v;
打破
案例5:
r=v;
g=m;
b=mid2;
打破
}
}
ColorRGB rgb=新的ColorRGB();
rgb.R=换算为单位字节(R*255.0f);
rgb.G=换算为单位字节(G*255.0f);
rgb.B=换算为单位字节(B*255.0f);
rgb.A=换算为单位字节(A*255.0f);
返回rgb;
}
//色调范围从0.0到1.0
公众浮标
{
收到
{
//使用System.Drawing.Color.GetHue,但除以360.0F
//因为System.Drawing.Color以度(0-360)为单位返回色调
//而不是一个介于0和1之间的数字。
返回((颜色)this.GetHue()/360.0F;
}
}
//0.0-1.0范围内的饱和度
公众浮标
{
收到
{
返回((颜色)this.GetSaturation();
}
}
//亮度范围为0.0-1.0
公众浮标
{
收到
{
返回((颜色)this.GetBrightness();
}
}
}

不久前我遇到了这个问题。以下解决方案高亮显示颜色,保留原始颜色。您可以使用它突出显示按钮背面的颜色(但保留它)。否则,您应该拥有DrawYou按钮,并寻找一个好的机制来突出显示它(发光、边框等…)。希望能有帮助

public static Color HighLight(Color c)
{
    ColorRGB color = new ColorRGB(c);

    float newLValue = color.L;

    float highlightFactor = 0.25f; //from 0 to 1

    // change lightness
    if (color.L >= 0.5)
    {
        newLValue -= highlightFactor;
    }
    else
    {
        newLValue += highlightFactor;
    }

    ColorRGB highlighted = 
        FromHSLA(
        color.H, 
        color.S, 
        newLValue, 
        color.A);

    return Color.FromArgb(highlighted.A, highlighted.R, highlighted.G, highlighted.B);
}

public class ColorRGB
{
    public byte R;
    public byte G;
    public byte B;
    public byte A;

    public ColorRGB()
    {
        R = 255;
        G = 255;
        B = 255;
        A = 255;
    }

    public ColorRGB(Color value)
    {
        this.R = value.R;
        this.G = value.G;
        this.B = value.B;
        this.A = value.A;
    }
    public static implicit operator Color(ColorRGB rgb)
    {
        Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B);
        return c;
    }
    public static explicit operator ColorRGB(Color c)
    {
        return new ColorRGB(c);
    }


    // Given H,S,L in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSL(double H, double S, double L)
    {
        return FromHSLA(H, S, L, 1.0);
    }

    // Given H,S,L,A in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSLA(double H, double S, double L, double A)
    {
        double v;
        double r, g, b;
        if (A > 1.0)
            A = 1.0;

        r = L;   // default to gray
        g = L;
        b = L;
        v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S);
        if (v > 0)
        {
            double m;
            double sv;
            int sextant;
            double fract, vsf, mid1, mid2;

            m = L + L - v;
            sv = (v - m) / v;
            H *= 6.0;
            sextant = (int)H;
            fract = H - sextant;
            vsf = v * sv * fract;
            mid1 = m + vsf;
            mid2 = v - vsf;
            switch (sextant)
            {
                case 0:
                    r = v;
                    g = mid1;
                    b = m;
                    break;
                case 1:
                    r = mid2;
                    g = v;
                    b = m;
                    break;
                case 2:
                    r = m;
                    g = v;
                    b = mid1;
                    break;
                case 3:
                    r = m;
                    g = mid2;
                    b = v;
                    break;
                case 4:
                    r = mid1;
                    g = m;
                    b = v;
                    break;
                case 5:
                    r = v;
                    g = m;
                    b = mid2;
                    break;
            }
        }
        ColorRGB rgb = new ColorRGB();
        rgb.R = Convert.ToByte(r * 255.0f);
        rgb.G = Convert.ToByte(g * 255.0f);
        rgb.B = Convert.ToByte(b * 255.0f);
        rgb.A = Convert.ToByte(A * 255.0f);
        return rgb;
    }

    // Hue in range from 0.0 to 1.0
    public float H
    {
        get
        {
            // Use System.Drawing.Color.GetHue, but divide by 360.0F 
            // because System.Drawing.Color returns hue in degrees (0 - 360)
            // rather than a number between 0 and 1.
            return ((Color)this).GetHue() / 360.0F;
        }
    }

    // Saturation in range 0.0 - 1.0
    public float S
    {
        get
        {
            return ((Color)this).GetSaturation();
        }
    }

    // Lightness in range 0.0 - 1.0
    public float L
    {
        get
        {
            return ((Color)this).GetBrightness();
        }
    }
}
公共静态颜色高亮显示(c色)
{
ColorRGB color=新的ColorRGB(c);
float newLValue=color.L;
float highlightFactor=0.25f;//从0到1
//变光
如果(颜色L>=0.5)
{
newLValue-=高光系数;
}
其他的
{
newLValue+=高亮度因子;
}
彩色RGB高亮显示=
弗罗姆斯拉(
颜色,
颜色,
新左值,
颜色(A);
返回Color.FromArgb(高亮显示的.A、高亮显示的.R、高亮显示的.G、高亮显示的.B);
}
公共类彩色RGB
{
公共字节R;
公共字节G;
公共字节B;
公共字节A;
公共颜色RGB()
{
public class ButtonX : Button {
    GraphicsPath border = new GraphicsPath();
    int radius = 3;
    float borderWidth;
    Color borderColor = Color.Orange;
    bool _checked;
    public float BorderWidth {
        get { return borderWidth; }
        set {
            borderWidth = value;
            Invalidate();
        }
    }
    public Color BorderColor {
        get { return borderColor; }
        set {
            borderColor = value;
            Invalidate();
        }
    }
    public ButtonX() {
        BorderWidth = 4;
    }
    public bool Checked {
        get { return _checked; }
        set { 
            _checked = value;
            Invalidate();
        }
    }
    protected override void OnPaint(PaintEventArgs pevent) {
        base.OnPaint(pevent);
        if (Checked) {
            pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            for (float f = BorderWidth; f >= 0.01f; f -= 1f)
            {
                using (Pen pen = new Pen(Color.FromArgb((int)(100 - 100 * f * f / (BorderWidth * BorderWidth)), borderColor), f))
                {
                    pen.LineJoin = LineJoin.Round;
                    pen.Alignment = PenAlignment.Center;
                    pevent.Graphics.DrawPath(pen, border);
                }
            }
        }
    }
    private void UpdateBorder() {
        border = new GraphicsPath();
        RectangleF rect = new RectangleF{Width = radius * 2, Height = radius * 2, X = BorderWidth/2, Y = BorderWidth/2};
        border.AddArc(rect, 180, 90);
        rect.X = ClientSize.Width - BorderWidth/2 - radius * 2 - 0.5f;            
        border.AddArc(rect, 270, 90);
        rect.Y = ClientSize.Height - BorderWidth/2 - radius * 2 - 0.5f;
        border.AddArc(rect, 0, 90);
        rect.X = BorderWidth / 2;
        border.AddArc(rect, 90, 90);
        border.CloseAllFigures();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        UpdateBorder();
    }
}