c# - Winforms 中自定义控件绘画的最佳实践?

标签 c# .net winforms gdi+

通常,当我覆盖 OnPaint 方法时,我会在其中创建笔和刷子等,然后将它们丢弃。

我还在某处读到,与其重新创建这些笔和画笔等,不如将它们创建为静态成员一次,然后在关闭表单时将它们处理一次,等等。

这是更好的做法吗?

有更好的方法吗?

我可以假设,由于 OnPaint 被调用了 1000 次(?)次,与仅创建一次相比,这将为 GC 带来大量工作。

最佳答案

如果画笔和笔不会改变,那么创建一次并重复使用它们当然更好。但是请注意,如果您的控件可能在多个线程上使用(这种可能性很小),您应该使它们成为 ThreadStatic(并在每个线程首次使用时进行初始化)或使它们成为实例成员(并且在您的控件的 Dispose 覆盖中处置它们);否则,您将得到不可重现的 GDI+ 错误,因为 GDI+ 对象不能同时在多个线程上使用。图像也是如此。

如果它们确实发生了变化(例如,如果您使用取决于控件大小的渐变画笔),您可能仍希望将它们存储在实例字段中,并在控件大小(或其他)发生变化时重新创建它们。

请注意,顺便说一下,如果您使用普通颜色,则可以使用静态 BrushesPens类,其中包含所有 .Net 内置颜色的静态画笔和笔,以及 SystemBrushesSystemPens用于系统颜色。

关于c# - Winforms 中自定义控件绘画的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718202/

相关文章:

c# - 解析或提取 html 表的内容

c# - 只允许在构造函数中设置值的设置访问器的名称是什么?

c# 仍然返回错误的核心数

c# - 图像列表/图像内存不足异常

c# - 我应该为表中的密码字段使用什么? MD5 还是 SHA1?

c# - 如何在 PowerShell 脚本中使用 NuGet 包?

c# - 你如何在C#中模拟鼠标点击?

c# - 无法从 Parse 检索数组

c# - 如何更改 ViewCell 中的高度

c# - 创建字符的方法