视觉风格独立绘图

DxC*_*xCK 6 c# drawing winforms visual-styles

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

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

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

根据 MSDN 文档,唯一与视觉样式无关的类是ButtonRendererCheckBoxRendererGroupBoxRendererRadioButtonRenderer。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制部件。

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

包括 Tab 控件在内的内置控件已经具有这种功能,可以使用或不使用视觉样式来绘制自己。为什么微软不向自定义控件创建者公开这个功能?为什么自定义控件创建者应该受苦?

Dav*_*son 0

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

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

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

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