Как нарисовать кнопку с нестандартным BackColor? - PullRequest
0 голосов
/ 19 февраля 2010

Я использую ButtonRenderer, чтобы нарисовать кнопку в пользовательской ячейке. Мне бы хотелось, чтобы на кнопке был нестандартный BackColor. Это поддерживается обычными кнопками, но в ячейках кнопок нет ничего или ButtonRenderer, чтобы поддерживать это. Как нарисовать кнопку с нестандартным BackColor? Метод должен учитывать тему пользователя - я не могу просто нарисовать свою кнопку.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

ButtonRenderer использует VisualStyleRenderer.DrawBackground () для рисования фона кнопки. Этот метод очень хорошо осведомлен о выбранной пользователем теме, фон кнопки будет использовать цвета, указанные в теме. Использование нестандартного BackColor нарушит выбранную пользователем тему. Вы не можете иметь это в обоих направлениях.

Класс Button на самом деле не использует ButtonRenderer, он использует один из трех средств визуализации, полученных из внутреннего класса ButtonBaseAdapter в пространстве имен System.Windows.Forms.ButtonInternal. Эти средства визуализации являются внутренними, вы не можете использовать их в своем собственном коде. Взгляните на них с помощью Reflector или Reference Source, чтобы увидеть, что нужно. Сосредоточьтесь на метод PaintButtonBackground.

0 голосов
/ 19 февраля 2010

Нарисуйте свою собственную кнопку, используя прилагаемые классы 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...