【问题标题】:Recoloring TabControl重新着色 TabControl
【发布时间】:2015-08-29 15:10:45
【问题描述】:

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

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

我真正想做的是让标签保持简单和扁平改变它们的颜色。检查选项卡在 Visual Studio 中的方式作为示例(检查第三张图片)。

有什么想法吗?

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

【问题讨论】:

    标签: c# .net winforms colors tabs


    【解决方案1】:

    当您使用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 来绘制与字体大小不同的文本。

    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 效果,但无论如何它们似乎与彩色标签发生冲突。

    【讨论】:

    • 哦,抱歉没有回复。好吧,我确实为你的努力投了赞成票,它确实改变了标题的颜色,但是控件周围的颜色(看左边的第一张图片(那条白线))保持不变,我没有想出了一个方法来改变它。
    • 我不确定你指的是哪张图片中的白线。
    • 我添加了一张新图片。正是这条白线环绕着标签页。 DrawMode 设置为Normal 还是OwnerDrawFixed 是可见的。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多