1

ボタンを強調表示するにはどうすればよいでしょうか?

これは、使用されているか、使用が許可されていません。

  • 変更しないでくださいbutton.Text(古いテキストを保持する必要があります)
  • 変更しないでくださいbutton.BackColor(ボタンはすでに非常にカラフルです)
  • 変更しないでくださいbutton.Enabled(使用されますが、十分ではありません)

ここに画像の説明を入力

アイデアは、通常のボタンだけを備えた RadioButton-group のようなものを持つことです。選択したボタンは、目の隅で簡単に見られる必要があります。

私も持っていたアイデア:

  • ボーダー/シェーディング: 使用したことがなく、デフォルトのボタンのシェーディングや単一のボタンのボーダー スタイルを変更する方法がわかりません。
  • フォント(下線)
  • 画像(試していません)
4

3 に答える 3

3

通常、ボタンの強調表示は で行う必要がありますがBackColor、何か違うものが必要な場合は、 のルック アンド フィールをBorder簡単に変更できます。ボーダーのルック アンド フィールの 1 つを実装するコードを次に示します。

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();
    }
}

ButtonX上記には と呼ばれるプロパティがありChecked、これを必要に応じて変更できます。これは、 がいつhighlighted border表示されるかを決定するプロパティです。true強調表示された境界線を表示するには、 に設定するだけです。いくつかのスクリーン ショットを次に示します (枠線は8):

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-10-30T15:29:18.463 に答える
1

私はしばらく前にこの問題を抱えていました。次のソリューションでは、元の色を維持しながら、色を強調表示します。ボタンの背景色を強調表示するために使用できます(ただし、それは保持されます)。それ以外の場合は、所有者がボタンを描画し、それを強調表示するための適切なメカニズム (グロー、ボーダーなど) を探す必要があります。それが役に立てば幸い。

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();
        }
    }
}
于 2013-10-30T10:23:12.540 に答える
1

おそらく、トグル ボタンの動作を探していますが、グループ内で相互に排他的です。チェックボックスのグループを作成し、その外観をボタンに設定できます。ただし、相互に排他的な動作はコードで処理する必要があります。

あるいは、ラジオ ボタンのグループを作成して、その外観をボタンに設定することもできます。

radioButton1.Appearance = Appearance.Button;
于 2013-10-30T10:24:48.553 に答える