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