6

我想TabControl用自定义功能绘制一个自定义。

为此,我继承了 Panel 类并重写了 OnPaint 方法以使用TabRenderer类进行绘制。

问题是TabRenderer只有在启用视觉样式时才能工作(可以检查TabRenderer.IsSupported),但是如果禁用视觉样式我该怎么办?

在这种情况下,我认为使用ControlPaint该类来绘制没有视觉样式的选项卡,但它没有与选项卡相关的绘制方法。我希望它基本上在视觉上表现得像常规的TabControl.

4

2 回答 2

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);
于 2010-04-09T12:45:50.463 回答
0

这是一个“外面”的答案,但您可以使用 wpf 吗?正如您从上面的答案中看到的那样,在 Winforms 中自定义控件是一件很痛苦的事情,而在 WPF 中,每个控件都是无外观的。这意味着您可以完全控制渲染的内容及其外观。

于 2010-04-13T14:35:28.923 回答