使用C#winforms,我想创建看起来像真实的自定义控件。
有很多类可用于绘制看起来像真实的控件:ControlPaint
,VisualStyleRenderer
,ButtonRenderer
,CheckBoxRenderer
,{{1 }},ComboBoxRenderer
,GroupBoxRenderer
,ProgressBarRenderer
,RadioButtonRenderer
,ScrollBarRenderer
,TabRenderer
,TextBoxRenderer
,TextRenderer
,ToolStripProfessionalRenderer
,ToolStripRenderer
,ToolStripSystemRenderer
。
考虑视觉风格时出现的问题:我希望视觉风格独立。含义:我不在乎用户是否允许视觉风格,我希望它能够工作。如果用户启用了视觉样式,我想使用视觉样式绘制它,否则我想在没有视觉样式的情况下绘制它。
通过MSDN文档,唯一独立于视觉样式的类是TrackBarRenderer
,ButtonRenderer
,CheckBoxRenderer
,GroupBoxRenderer
。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式并使用不同的代码来绘制部件。
假设我想自己绘制一个Tab控制部件。 RadioButtonRenderer
类具有所有需要的功能,但只有在用户启用的视觉样式时才有效。否则我需要使用TabRenderer
类绘制,但它使用完全不同的模型,没有ControlPaint
方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,所以它看起来像一个真正的标签。那很讨厌。
内置控件(包括Tab控件)已经具有使用或不使用视觉样式绘制自身的功能。为什么微软不会为自定义控件创建者公开此功能?为什么自定义控件创建者会受到影响?
答案 0 :(得分:0)
不幸的是,这是一种痛苦,但这是编写自定义控件的成本。我在许多WinForm控件中看到Microsoft这样做的方法是检查Application.RenderWithVisualStyes和Control.UseVisualStyleBackColor。根据这些值,他们会相应地绘制控件。
他们使用的常见模式是创建名为MyControlRenderer.cs的内部类。在这个渲染器里面是魔法实际发生的地方。如果你看一下NET REF代码,你会看到他们也使用System.Windows.Forms.VisualStyles命名空间中的VisualStyleRenderer类,并且还有一些实际的绘图代码。
您需要混合使用这些不同的类和工具,并混合使用自己的工作。使用和不使用视觉样式在计算机上测试控件。
当我希望下班回家时,我会发布更多内容。