选择DrawMode = OwnerDrawFixed时,更改特定选项卡页面选项卡颜色/丢失格式

时间:2015-01-05 22:32:25

标签: c# winforms visual-studio controls

在尝试根据按钮点击事件更改标签的颜色时,我遇到了这个页面:

Set TabPage Header Color

它似乎工作,但我丢失了我的选项卡的所有其他格式,现在我设置DrawMode = OwnerDrawFixed后它们显示为空白。如何设置特定页面的选项卡颜色并仍然显示标签正常?

代码:

private void button3_Click(object sender, EventArgs e)
{
    this.TabControlMain.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TabControlMain_DrawItem);
    SetTabHeader (tabDownload, System.Drawing.Color.Green);
}
private Dictionary<TabPage, Color> TabColors = new Dictionary<TabPage, Color>();
private void SetTabHeader(TabPage page, Color color)
{
    TabColors[page] = color;
    tabDownload.Invalidate();
}

private void TabControlMain_DrawItem(object sender, DrawItemEventArgs e)
{
    //e.DrawBackground();
    using (Brush br = new SolidBrush(TabColors[TabControlMain.TabPages[e.Index]]))
    {
        e.Graphics.FillRectangle(br, e.Bounds);
        SizeF sz = e.Graphics.MeasureString(TabControlMain.TabPages[e.Index].Text, e.Font);
        e.Graphics.DrawString(TabControlMain.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1);

        Rectangle rect = e.Bounds;
        rect.Offset(0, 1);
        rect.Inflate(0, -1);
        e.Graphics.DrawRectangle(Pens.DarkGray, rect);
        e.DrawFocusRectangle();
    }
}

下面是截屏Screenshot

2 个答案:

答案 0 :(得分:0)

使用Y(et)A(nother)TabControl

使您可以绘制自己的自定义标题:

TabControl

TabControl

public override void DrawTab( Color foreColor,
                              Color backColor,
                              Color highlightColor,
                              Color shadowColor,
                              Color borderColor,
                              bool active,
                              bool mouseOver,
                              DockStyle dock,
                              Graphics graphics,
                              SizeF tabSize )
{
  if( active )
  {
    Pen p = new Pen( borderColor );
    graphics.DrawRectangle( p, 0, 0, tabSize.Width, tabSize.Height );
    p.Dispose();
  }
  else
  {
    Brush b = Brushes.Peru;
    float dif = tabSize.Height / 4.0f;
    RectangleF r = new RectangleF( 0.0f, dif, 
         tabSize.Width, tabSize.Height - dif - dif );
    graphics.FillRectangle( b, r );
  }
}

答案 1 :(得分:0)

原则上你的代码可以工作,如果不是很好,那么至少就足够了。

但是你需要解决一些简单的问题:

  • 当然,如果你的标签是OwnerDrawn,你需要从一开始就这样做,而不是在按下按钮之后!因此,请从一开始就将事件连接起来,最好放在Property-Event Tab中,以便将其置于Desgner.cs所属的文件中。

现在绘制Tabs并显示其标签文本。

  • 如果您想更改颜色,您需要使Tab控件无效, TabPage

所以改变

tabDownload.Invalidate();

TabControlMain.Invalidate();

为了使示例完整,我只做了这个:

private void Form1_Load(object sender, EventArgs e)
{
    foreach (TabPage tp in TabControlMain.TabPages)
            TabColors.Add(tp, tp.BackColor);
}

这会将字典中的所有Tab颜色设置为Pages的颜色。

  • 可以改进绘制FocusRectangle的代码。

首先像这样设置Padding

this.TabControlMain.Padding = new System.Drawing.Point(10, 4);

这为我们提供了足够的空间来绘制一个漂亮的FocusRectangle ..

然后更改代码以仅在选定的选项卡上绘制它,可能是这样的:

    if (TabControlMain.SelectedIndex == e.Index)
        using (Pen pen = new Pen(Color.Gray))
        {
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            Rectangle rect = e.Bounds;
            rect.Offset(0, 1);
            rect.Inflate(-3,-2);
            e.Graphics.DrawRectangle(pen, rect);
        }

现在看起来像这样:

enter image description here

当然,管理颜色取决于你......