我想使用自定义功能绘制自定义TabControl
。
为此,我继承了Panel类并重写了OnPaint方法以使用TabRenderer
类进行绘制。
问题是TabRenderer
仅在启用视觉样式时才能工作(可以使用TabRenderer.IsSupported
进行检查),但如果禁用了视觉样式,该怎么办?
在这种情况下,我想使用ControlPaint
类绘制没有视觉样式的标签,但它没有与标签相关的绘图方法。我希望它基本上像常规TabControl
一样在视觉上表现。
答案 0 :(得分:5)
您必须自己绘制,因为没有为此发布API。希望以非视觉方式这样做相对容易。
您可以使用ControlPaint.DrawBorder3D绘制窗格边框,并使用类似以下代码的按钮:
int Top = bounds.Top;
int Bottom = bounds.Bottom - 1;
int Sign = 1;
if (tabStrip.EffectiveOrientation == TabOrientation.Bottom)
{
Top = bounds.Bottom - 1;
Bottom = bounds.Top;
Sign = -1;
}
using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight))
{
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign);
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top);
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top);
}
using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight))
{
e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign);
e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign);
}
using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark))
{
e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign);
e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom);
}
using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark))
e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom);
答案 1 :(得分:0)
这是一个“外面”的答案,但是你可以使用wpf吗?正如你从上面的答案中看到的那样,在winform中自定义控件是一种痛苦,因为在WPF中每个控件都是无形的。这意味着您可以控制渲染的内容以及渲染的外观。