如何使用非标准BackColor绘制按钮?

时间:2010-02-19 12:16:57

标签: c# .net winforms button

我正在使用ButtonRenderer在自定义单元格中绘制按钮。我希望按钮有一个非标准的BackColor。普通按钮支持此功能,但按钮单元格中没有任何内容或ButtonRenderer支持它。如何使用非标准BackColor绘制按钮?该方法必须考虑用户的主题 - 我不能只绘制我自己的按钮。

2 个答案:

答案 0 :(得分:2)

ButtonRenderer使用VisualStyleRenderer.DrawBackground()绘制按钮背景。该方法非常了解用户选择的主题,按钮的背景将使用主题指定的颜色。使用非标准BackColor会违反用户选择的主题。你无法双管齐下。

Button类实际上并不使用ButtonRenderer,它使用从System.Windows.Forms.ButtonInternal命名空间中的内部ButtonBaseAdapter类派生的三个渲染器之一。这些渲染器是内部的,您不能在自己的代码中使用它们。使用Reflector或Reference Source查看它们,看看它需要什么。专注于PaintButtonBackground方法。

答案 1 :(得分:-1)

使用提供的ControlPaint和TextRenderer类绘制自己的按钮。这很简单。我快速将这些代码放在一起向您展示。您可以通过设置边框样式等来美化按钮的外观。

    private ButtonState state = ButtonState.Normal;
    public ButtonCell(): base()
    {
        this.Size = new Size(100, 40);
        this.Location = new Point(50, 50);
        this.Font = SystemFonts.IconTitleFont;
        this.Text = "Click here";     
    }
    private void DrawFocus()
    {
        Graphics g = Graphics.FromHwnd(this.Handle);
        Rectangle r = Rectangle.Inflate(this.ClientRectangle, -4, -4);
        ControlPaint.DrawFocusRectangle(g, r);
        g.Dispose();
    }
    private void DrawFocus(Graphics g)
    {
        Rectangle r = Rectangle.Inflate(this.ClientRectangle, -4, -4);
        ControlPaint.DrawFocusRectangle(g, r);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        if (state == ButtonState.Pushed)
            ControlPaint.DrawBorder3D(e.Graphics, e.ClipRectangle, Border3DStyle.Sunken);
        else
            ControlPaint.DrawBorder3D(e.Graphics, e.ClipRectangle, Border3DStyle.Raised);
        TextRenderer.DrawText(e.Graphics, Text, this.Font, e.ClipRectangle, this.ForeColor,
            TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
    }
    protected override void OnGotFocus(EventArgs e)
    {
        DrawFocus();
        base.OnGotFocus(e);
    }
    protected override void OnLostFocus(EventArgs e)
    {
        Invalidate();
        base.OnLostFocus(e);
    }
    protected override void OnMouseEnter(EventArgs e)
    {
        DrawFocus();
        base.OnMouseEnter(e);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        Invalidate();
        base.OnMouseLeave(e);
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        state = ButtonState.Pushed;
        Invalidate();
        base.OnMouseDown(e);
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
        state = ButtonState.Normal;
        Invalidate();
        base.OnMouseUp(e);
    }