Eigene Farben in TabControl-Reitern
Frank Dzaebel, erstellt am:
29.12.2008, zuletzt geändert: 29.12.2008
Kategorie:TabControl, .NET-Version:3.5, [Download]
Hier wird eine Beispiel-Implementierung eines TabControl mit
benutzerdefinierbaren Vordergrund- und Hintergrundfarben für die einzelnen TabPages
aufgeführt. Es gibt im Netz bereits viele Vorschläge. Zum Beispiel: [Dotnetrix. Mick Doherty's .net tips and tricks].
Allerdings haben alle gewisse Nachteile (wie auch die
hier dargestellte Lösung).

using System.Windows.Forms;
using System.Drawing;
using System.Windows.Forms.VisualStyles;
using System.Diagnostics;
namespace ColorTabControl
{
class ColorTabControl : TabControl
{
public ColorTabControl()
{
this.DrawMode = TabDrawMode.OwnerDrawFixed;
this.SelTabForeColor = Color.Red;
this.SelTabBackColor = Color.Empty; //
Standard-BackColor
backBrush = new SolidBrush(SelTabBackColor);
}
/// <summary>Vordergrund-Farbe der selektierten TabPage</summary>
public Color SelTabForeColor { get; set; }
/// <summary>Hintergrund-Farbe der selektierten TabPage</summary>
public Color SelTabBackColor
{
get { return selTabBackColor; }
set
{
selTabBackColor = value;
if (backBrush != null) backBrush.Dispose();
backBrush = new SolidBrush(selTabBackColor);
}
}
private Color selTabBackColor = Color.Empty;
private const int KeinImageIndex = -1;
private const string keinImageKey = "";
private const int verschiebungImageX = 4;
private const int verschiebungImageY = 2;
private Brush backBrush;
protected override void OnDrawItem(DrawItemEventArgs e)
{
Graphics g = e.Graphics;
TabPage tabPage = this.TabPages[e.Index];
Rectangle bounds = GetTabRect(e.Index);
Debug.WriteLine(e.State);
TextFormatFlags tff = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter;
Image image = null;
if (tabPage.ImageIndex != KeinImageIndex) image = ImageList.Images[tabPage.ImageIndex];
if (tabPage.ImageKey != keinImageKey) image = ImageList.Images[tabPage.ImageKey];
bool selected = (e.State == DrawItemState.Selected);
Rectangle imgRect = Rectangle.Empty;
if (image != null)
imgRect = new Rectangle(bounds.X + verschiebungImageX, bounds.Y + verschiebungImageY,
ImageList.ImageSize.Width, ImageList.ImageSize.Height);
if (selected)
DrawTabItem(g, bounds, tabPage.Text, Font, tff,
SelTabForeColor, image, imgRect, true, TabItemState.Selected);
else
DrawTabItem(g, bounds, tabPage.Text, Font, tff,
Color.Empty, image, imgRect, false, TabItemState.Normal);
}
private VisualStyleRenderer visualStyleRenderer;
public void DrawTabItem(Graphics g, Rectangle bounds,
string tabItemText, Font font, TextFormatFlags flags, Color foreColor,
Image image, Rectangle imageRectangle, bool focused, TabItemState state)
{
InitializeRenderer(VisualStyleElement.Tab.TabItem.Normal, (int)state);
if (state == TabItemState.Selected)
g.FillRectangle(backBrush, bounds);
else
visualStyleRenderer.DrawBackground(g, bounds);
Rectangle r = bounds;
int imageWidth = (image == null) ? 0 : image.Width;
if (foreColor == Color.Empty)
foreColor = visualStyleRenderer.GetColor(ColorProperty.TextColor);
Rectangle recText = new Rectangle(r.X + imageWidth + verschiebungImageX,
r.Y, r.Width - imageWidth - verschiebungImageX, r.Height);
TextRenderer.DrawText(g, tabItemText, font, recText, foreColor, flags);
if (image != null) visualStyleRenderer.DrawImage(g, imageRectangle, image);
if (focused) ControlPaint.DrawFocusRectangle(g, r);
}
private void InitializeRenderer(VisualStyleElement element, int state)
{
if (visualStyleRenderer == null)
visualStyleRenderer = new VisualStyleRenderer(element.ClassName, element.Part, state);
else
visualStyleRenderer.SetParameters(element.ClassName, element.Part, state);
}
}
}