有时我需要控件的自定义外观。或者做很多定制绘画。我知道我可以这样做OnPaint
(参见:http: //msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx)
使用 .net 应用程序自定义绘制内容的正确方法是什么OnPaint
?是否有任何规则我必须牢记以保持我的应用程序优化,并将渲染时间保持在最低限度?
注意:我不时看到并经历过很多 OnPaint 的低效使用,因此我创建了这个 Q&A。
有时我需要控件的自定义外观。或者做很多定制绘画。我知道我可以这样做OnPaint
(参见:http: //msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx)
使用 .net 应用程序自定义绘制内容的正确方法是什么OnPaint
?是否有任何规则我必须牢记以保持我的应用程序优化,并将渲染时间保持在最低限度?
注意:我不时看到并经历过很多 OnPaint 的低效使用,因此我创建了这个 Q&A。
为了OnPaint
有效地使用你必须知道几件事:
OnPaint
of (例如 of )(duhh ...)Form1
OnPaint
时都会执行of 。例如,如果你在右上角画一个点,当你有150个子控件时,这个点至少会被画150次!它大大增加了渲染时间。特别是如果您在.
Form1
Form1
Form1
OnPaint
Form1
Form1
OnPaint
OnPaint
因此,当一个控件有一个或多个子控件时,通常不能在控件中包含任何逻辑。相反,您应该制作一个自定义控件,该控件上不再包含子控件,它可以完成绘制工作。并将其作为子控件放置在需要自定义绘图的位置的父控件上。Form1
,则必须使用Form1.SuspendLayout()
(请参阅:http: //msdn.microsoft.com/en-us/library/system.windows.forms.control。 suspendlayout.aspx ) 在添加子控件之前。Form1.ResumeLayout()
当您完成添加控件时。这会暂时抑制OnPaint
事件,并减少渲染时间。OnPaint
父控件中的事件数量。例如,在彼此下方放置 4 个文本框,以便它们相互连接。因此它们之间没有背景,控件全部绘制在一个OnPaint
事件而不是 4 个OnPaint
事件中。当然,这并不总是可行的,因为您不想并排粘合所有组件。但是,如果性能比外观更重要,例如在某种大型自定义“数据网格”中,这样做是值得的。OnPaint
事件中控件的位置或大小,因为这会调用新OnPaint
事件。OnPaint
如果您必须重新定位/调整控件大小,则必须在调用之前将其添加到代码中的其他位置。例如,将重定位/调整大小代码放在OnLayout
或OnResize
类似事件中。如果您仍然认为必须在OnPaint
事件中放置重定位/调整大小代码才能使应用程序正常工作,那么您就错了,您需要修改代码的逻辑。好吧,我想这就是全部,如果我忘记了什么,我会更新这个问答。如果我忘记了什么,或者我犯了一个错误,我会很高兴注意到它!
希望这将使某人在.Net 中使用自定义绘画内容方面占得先机,因为我前段时间一直在寻找此信息。