我有一个我想要自定义的标签控件。更具体地说,我想更改标签页标题的颜色,以及标签页周围白线的颜色(查看第一张图片)。
我想过使用自定义渲染器来执行此操作(例如,类似于重新添加菜单条),但我不确定如何执行此操作。我还读到将DrawMode
设置为OwnerDrawFixed
可能会这样做,但使用此选项会使标签控件看起来好像我的程序是在90年代制作的(检查第二张图片)。
我真正想做的是保持标签简单明了和改变颜色。检查选项卡在Visual Studio中的方式作为示例(查看第三张图片)。
有什么想法吗?
修改:标签页的另一张图片,以便更清楚这条"白线"是
答案 0 :(得分:2)
当您使用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效果,但无论如何它们似乎都会与彩色标签冲突。