使用C# winforms,我想创建看起来像真实控件的自定义控件。
有很多类可以用来绘制看起来像真实控件的控件:ControlPaint
、VisualStyleRenderer
、ButtonRenderer
、CheckBoxRenderer
、ComboBoxRenderer
、GroupBoxRenderer
、ProgressBarRenderer
、RadioButtonRenderer
、ScrollBarRenderer
、<代码>D9、<代码>D10、<代码>D11、<代码>D12、<代码>D13、<代码>D14、<代码>D15。
考虑视觉风格时出现的问题:我想独立于视觉风格。意思:我不关心用户是否允许视觉风格,我希望它能工作。如果用户启用了视觉样式,我想使用视觉样式来绘制它,否则我想不使用视觉样式来绘制它。
根据MSDN文档,唯一独立于视觉样式的类是ButtonRenderer
、CheckBoxRenderer
、GroupBoxRenderer
和RadioButtonRenderer
。这意味着对于所有其他情况,我需要检查自己是否启用了视觉样式,并使用不同的代码来绘制部件。
假设我想自己绘制一个Tab控件部件。TabRenderer
类具有所有需要的功能,但它只有在用户启用视觉样式的情况下才能工作。否则我需要使用ControlPaint
类来绘制,但它使用完全不同的模型,没有ControlPaint.DrawTab()
方法或类似的东西,我需要弄清楚我需要绘制哪些矩形类型,以便它看起来像一个真正的选项卡。这太烦人了。
内置控件(包括Tab控件)已经具有此功能,可以在具有或不具有视觉样式的情况下绘制自身。为什么微软不向自定义控件创建者公开此功能?为什么自定义控件创建者应该受到影响?
发布于 2010-08-15 00:59:07
不幸的是,这是一个痛苦,但这是编写自定义控件的成本。我看到微软在许多WinForm控件中这样做的方式是检查Application.RenderWithVisualStyes和Control.UseVisualStyleBackColor。根据这些值,它们将相应地绘制控件。
它们使用的一种常见模式是创建名为MyControlRenderer.cs的内部类。在这个渲染器里面是魔术真正发生的地方。如果您查看NET REF代码,您将看到它们也使用来自System.Windows.Forms.VisualStyles命名空间的VisualStyleRenderer类,并且还有一些实际的绘图代码。
您将需要混合使用这些不同的类和工具,以及混合使用您自己的工作。在具有和不具有视觉样式的计算机上测试您的控件。
当我希望下班回家的时候,我会多发一点。
https://stackoverflow.com/questions/3484143
复制相似问题