2010-04-05 42 views
6

我想用自定义功能绘制自定义TabControl没有启用视觉样式的TabRenderer?

要做到这一点,我继承了Panel类和overrided OnPaint方法与TabRenderer类绘制。

问题是TabRenderer只能在视觉样式启用的情况下工作(可以用TabRenderer.IsSupported来检查),但是如果视觉样式被禁用,该怎么办?

在这种情况下,我想到了使用ControlPaint类绘制没有视觉样式的标签,但它具有与标签没有平局的方法。我希望它基本上像常规的TabControl一样具有视觉效果。

+0

以什么方式你想自定义'TabControl'从'System.Windows.Forms.TabControl'不同? – 2010-04-08 20:35:32

+0

允许动画作为标签的图标,允许在每个标签上自定义淹没X按钮,当选项卡控件不符合控件宽度时允许更改左右按钮的位置和绘图,允许右键单击标签,允许用鼠标中键关闭,允许拖放tabpages ...我希望功能上像在Firefox中的标签。 – DxCK 2010-04-09 10:22:04

回答

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); 
+3

你可以使用SystemPens简化这个有很多 - http://msdn.microsoft.com/en-us/library/system.drawing.systempens.aspx – Simon 2010-04-13 14:37:29

+0

感谢这个代码!看起来像真正的一个!谢谢! :-D – DxCK 2010-04-14 04:14:32

0

这是一个“那里”的答案,但有没有可能,你可以使用WPF?正如你可以从上面的答案中看到的那样,在WPF中,每个控件都是不可见的,所以在winforms中自定义控件是一件痛苦的事情。这意味着你可以控制渲染的内容以及它看起来完全如何。

+0

感谢您的建议,但我需要支持Windows 2000,所以WPF现在不适合我。 – DxCK 2010-04-13 17:09:18