Winforms中自定义控件绘制的最佳实践?

Joa*_*nge 7 .net c# gdi+ winforms

通常当我重写OnPaint方法时,我会在其中创建笔和画笔等,然后处理它们.

我也读过一些地方,而不是重新创建这些笔和画笔等,以创建它们一次作为静态成员,然后在窗体关闭时将它们处理一次,等等.

这是一种更好的做法吗?

有更好的方法吗?

我可以假设,由于OnPaint被称为1000s(?)次,与仅创建一次相比,这将为GC创建大量工作.

SLa*_*aks 8

如果刷子和笔没有变化,那么创建它们并重复使用它们肯定会更好.但是请注意,如果您的控件可能在多个线程上使用(这是非常不可能的),您应该制作它们ThreadStatic(并在第一次使用每个线程时初始化)或者使它们成为实例成员(并将它们置于控件的Dispose覆盖中); 否则,您将获得无法生成的GDI +错误,因为GDI +对象不能同时在多个线程上使用.图像也是如此.

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

请注意,顺便说一下,如果你用正常的颜色,你可以使用静态BrushesPens类,其中包含所有的净内置的色彩静电刷子和笔,并SystemBrushesSystemPens系统的颜色.

  • 如果表单显示为.Show或Application.Run(或等效),表单仅在关闭时自动处理.表单showin与.ShowDialog在关闭时_not_处理. (3认同)