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 文档,唯一与视觉样式无关的类是ButtonRenderer、CheckBoxRenderer、GroupBoxRenderer、RadioButtonRenderer。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制部件。
假设我想自己绘制一个 Tab 控件部件。TabRenderer类具有所有需要的功能,但它只有在用户启用视觉样式时才有效。否则我需要使用ControlPaint类来绘制,但它使用完全不同的模型,没有ControlPaint.DrawTab()方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,以便它看起来像一个真正的标签。这很烦人。
包括 Tab 控件在内的内置控件已经具有这种功能,可以使用或不使用视觉样式来绘制自己。为什么微软不向自定义控件创建者公开这个功能?为什么自定义控件创建者应该受苦?
不幸的是,这很痛苦,但这就是编写自定义控件的成本。我看到 Microsoft 在许多 WinForm 控件中执行此操作的方式是检查 Application.RenderWithVisualStyes 和 Control.UseVisualStyleBackColor。根据这些值,他们将相应地绘制控件。
他们使用的常见模式是创建名为 MyControlRenderer.cs 的内部类。在这个渲染器内部才是真正发生魔法的地方。如果您查看 NET REF 代码,您会发现它们还使用 System.Windows.Forms.VisualStyles 命名空间中的 VisualStyleRenderer 类,并且还有一些实际的绘制代码。
您将需要混合使用这些不同的类和工具,并且还需要完成自己的工作。在具有和不具有视觉样式的机器上测试您的控制。
当我希望下班回家时,我会发布更多内容。