gpt4 book ai didi

c# - 重新着色 TabControl

转载 作者:行者123 更新时间:2023-11-30 21:57:19 27 4
gpt4 key购买 nike

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

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

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

enter image description here

有什么想法吗?

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

enter image description here

最佳答案

当您使用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();
}
}

基本结果:

enter image description here

我觉得标签拇指有点局促,没有默认的那么高。因此,我添加了一个 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);
}

enter image description here

您将以这种方式失去的一件事是 VisualStyles 效果,但它们似乎无论如何都会与彩色标签发生冲突。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com