我有一个要自定义的选项卡控件。更具体地说,我想更改标签页页眉的颜色,以及标签页周围白线的颜色(检查第一张图片)。

我考虑过使用自定义渲染器来执行此操作(例如,类似于对菜单栏重新着色),但是我不确定如何执行此操作。我还读到将DrawMode设置为OwnerDrawFixed可能会这样做,但是使用此选项会使制表符控件看起来像我的程序是在90年代制作的(请查看第二张图片)。

我真正想做的是使标签保持简单和平坦并更改其颜色。以在Visual Studio中查看选项卡的方式为例(查看第三张图片)。



有任何想法吗?

编辑:标签页的另一张图片,以便更清楚此“白线”是什么。

最佳答案

使用OwnerDrawFixed时,表示您将提供图纸代码。如果您没有连接并使用DrawItem事件,则不会绘制任何内容。这与设计时的外观几乎相同,因为该事件没有触发。对于设计时绘画,您必须将控件子类化并使用OnDrawItem

   // colors to use
   private Color[] TColors = {Color.Salmon, Color.White, Color.LightBlue};

   private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
   {
       // get ref to this page
       TabPage tp = ((TabControl)sender).TabPages[e.Index];

       using (Brush br = new SolidBrush(TColors[e.Index]))
       {
           Rectangle rect = e.Bounds;
           e.Graphics.FillRectangle(br, e.Bounds);

           rect.Offset(1, 1);
           TextRenderer.DrawText(e.Graphics, tp.Text,
                  tp.Font, rect, tp.ForeColor);

           // draw the border
           rect = e.Bounds;
           rect.Offset(0, 1);
           rect.Inflate(0, -1);

           // ControlDark looks right for the border
           using (Pen p = new Pen(SystemColors.ControlDark))
           {
               e.Graphics.DrawRectangle(p, rect);
           }

           if (e.State == DrawItemState.Selected) e.DrawFocusRectangle();
        }
   }


基本结果:



选项卡的拇指看起来有点局促,不如默认值高。因此,我添加了TFontSize来以与Font不同的大小绘制文本。

TabControl.Font设置为10(似乎足够),以便Windows绘制略大的拇指/标题。如果仍以默认的8.25绘制文本,则还有更多空间:

   private float TFontSize = 8.25F;       // font drawing size
   ...
   using (Font f = new Font(tp.Font.FontFamily,TFontSize))
   {
       // shift for a gutter/padding
       rect.Offset(1, 1);
       TextRenderer.DrawText(e.Graphics, tp.Text,
                     f, rect,  tp.ForeColor);
   }




您将通过这种方式松散的一件事是VisualStyles效果,但是无论如何它们似乎都与彩色选项卡冲突。

关于c# - 重新着色TabControl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30822870/

10-16 08:18