2010-08-14 50 views
3

使用C#winforms,我想创建看起来像真正的自定义控件。视觉样式独立绘图

有很多类,可用于绘制看起来像以假乱真控制:ControlPaintVisualStyleRendererButtonRenderer,,ComboBoxRendererGroupBoxRendererProgressBarRendererRadioButtonRendererScrollBarRendererTabRendererTextBoxRendererTextRendererToolStripProfessionalRendererToolStripRendererToolStripSystemRendererTrackBarRenderer

考虑视觉风格时会出现问题:我想成为独立的视觉风格。含义:如果用户允许视觉样式,我不在乎,我希望它能够工作。如果用户启用视觉样式,我想使用视觉样式绘制它,否则我想绘制它没有视觉样式。

通过MSDN文档,唯一可视风格独立的类是ButtonRenderer,,GroupBoxRendererRadioButtonRenderer。这意味着对于其他所有情况,如果启用视觉样式并使用不同的代码绘制零件,我需要检查自己。

假设我想绘制一个Tab控件部分我自己。 TabRenderer类具有所有需要的功能,但它只适用于用户启用的视觉样式。否则我需要使用ControlPaint类来绘制,但它使用完全不同的模型,没有ControlPaint.DrawTab()方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,因此它看起来像一个真正的选项卡。这很烦人。

内置控件(包括Tab控件)已具有使用或不使用视觉样式绘制自己的功能。为什么不向微软公开自定义控件创作者的这个功能?为什么自定义控件创作者应该受到影响?

回答

0

不幸的是,这是一个痛苦,但这是编写自定义控件的成本。我见过微软在许多WinForm控件中做这件事的方法是检查Application.RenderWithVisualStyes和Control.UseVisualStyleBackColor。根据这些值,他们将相应地绘制控件。

他们使用的常见模式是创建名为MyControlRenderer.cs的内部类。在这个渲染器里面是魔术实际发生的地方。如果你看看.NET REF代码,你会发现它们也使用System.Windows.Forms.VisualStyles命名空间中的VisualStyleRenderer类,并且还有一些实际的代码。

您将需要利用这些不同类别和工具的组合,以及您自己的工作组合。在没有视觉样式的情况下在机器上测试您的控件。

当我希望下班回家时,我会多发一点。

+0

你的名字响了。您是否曾经发布到MSDN论坛?希腊字母? – 2010-08-18 21:31:02

+0

是的,很久没有见到nobugz:D – 2010-08-19 02:42:04