6

使用 C# winforms,我想创建看起来像真实的自定义控件。

有很多类可以用来绘制看起来像真实的控件:ControlPaint, VisualStyleRenderer, ButtonRenderer, CheckBoxRenderer, ComboBoxRenderer, GroupBoxRenderer, ProgressBarRenderer, RadioButtonRenderer, ScrollBarRenderer, TabRenderer, TextBoxRenderer, TextRenderer, ToolStripProfessionalRenderer, ToolStripRenderer, ToolStripSystemRenderer, TrackBarRenderer.

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

根据 MSDN 文档,唯一独立于视觉样式的类是ButtonRenderer, CheckBoxRenderer, GroupBoxRenderer, RadioButtonRenderer. 这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制零件。

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

包括 Tab 控件在内的内置控件已经具有这种在有或没有视觉样式的情况下自行绘制的功能。为什么微软不向自定义控件创建者公开此功能?为什么自定义控件的创建者会受苦?

4

1 回答 1

0

不幸的是,这很痛苦,但这是编写自定义控件的成本。我在许多 WinForm 控件中看到 Microsoft 执行此操作的方式是检查 Application.RenderWithVisualStyes 和 Control.UseVisualStyleBackColor。根据这些值,他们将相应地绘制控件。

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

您将需要混合使用这些不同的类和工具,并混合使用您自己的工作。在具有和不具有视觉样式的机器上测试您的控件。

当我希望下班回家时,我会发布更多内容。

于 2010-08-14T16:59:06.953 回答