我正在使用ButtonRenderer
在自定義單元格中繪製按鈕。我想按鈕有一個非標準的BackColor。這由普通按鈕支持,但按鈕單元格或ButtonRenderer
中沒有任何內容支持它。如何繪製帶有非標準BackColor的按鈕?該方法必須考慮用戶的主題 - 我不能只繪製我自己的按鈕。如何繪製帶有非標準BackColor的按鈕?
0
A
回答
2
ButtonRenderer使用VisualStyleRenderer.DrawBackground()繪製按鈕背景。該方法非常瞭解用戶選擇的主題,按鈕的背景將使用主題指定的顏色。使用非標準的BackColor會違反用戶選擇的主題。你不能兩面都有。
Button類實際上並不使用ButtonRenderer,它使用從System.Windows.Forms.ButtonInternal命名空間的內部ButtonBaseAdapter類派生的三個渲染器之一。這些渲染器是內部的,你不能在你自己的代碼中使用它們。用Reflector或Reference Source看看它們的含義。專注於PaintButtonBackground方法。
-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);
}
相關問題
- 1. 非標準後退按鈕
- 2. 如何複製標準的Salesforce按鈕?
- 3. 簡化非標準按鈕的綁定
- 4. 繪製矩陣的標準錯誤(帶有複製數據)
- 5. 用ggplot2繪製非標準年(水年)
- 6. 如何用ggplot2繪製非標準化的數據?
- 7. 帶有非標準字符的SHA1
- 8. 帶有JNA的非標準類型
- 9. 如何重置爲默認按鈕BackColor?
- 10. Qt:如何實現QDialogButtonBox與QSignalMapper的非標準按鈕?
- 11. 如何在帶按鈕的畫布上繪製正方形
- 12. 按鈕BackColor不會改變
- 13. 更改按鈕BackColor屬性
- 14. 準備一個非標準內部發光的Android按鈕?
- 15. 自定義按鈕或鏈接到帶有標準控制器的Visualforce頁面
- 16. 按住鼠標按鈕時如何繪製?
- 17. 如何縮放按鈕內部的可繪製按鈕,使按鈕大小不受可繪製的控制?
- 18. 如何繪製上的啓動按鈕
- 19. 如何垂直對齊帶有背景可繪製按鈕的文本?
- 20. 如何製作帶有非圓角的小本機瀏覽器按鈕?
- 21. 是否有標準的按鈕尺寸?
- 22. Winform上的Datagridview不會繪製backcolor
- 23. 如何隱藏Acumatica標準按鈕
- 24. ChartJS - 繪製帶有月份標籤的圖表,按天數據
- 25. 如何爲anko中的按鈕設置圖標(可繪製)?
- 26. 如何在windows-CE中繪製按鈕?
- 27. 如何繪製按鈕故事板?
- 28. 熊貓:如何繪製帶有標籤的數據框的barchar?
- 29. 帶按鈕的控制單選按鈕
- 30. 更改中繼器按鈕onClick的backColor
這是ButtonStandardAdapter.PaintThemedButtonBackground發現竟然是至關重要的一個美化按鈕的外觀 - 它調用ButtonRender.DrawButton,然後收縮了4PX矩形,無論的主題。 – Simon 2010-02-19 13:49:56