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).

vorher nach Selektierung der zweiten TabPage ...

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);
    }
  }
}