[英]What is the right way to use OnPaint in .Net applications?
有时我需要一个自定义的控件外观。 或者做很多自定义绘画。 我知道我可以用OnPaint
这样做(参见: http : //msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx )
使用OnPaint
在.net应用程序上自定义绘制内容的正确方法是什么? 是否有任何规则需要记住以保持我的应用程序优化,并将渲染时间保持在最低限度?
注意:我已经看到并且经历过OnPaint的许多低效使用,因此我创建了这个问答。
要有效地使用OnPaint
您必须了解以下几点:
OnPaint
,例如Form1
的控件(duhh ...) Form1
的子控件时 ,都会执行Form1
的OnPaint
。 例如,如果你在画的右上角点Form1
使用OnPaint
的Form1
,当你有150个控件Form1
,该点会被吸引至少150倍! 它大大增加了渲染时间。 特别是如果你在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中使用自定义绘画的东西,因为我不久前正在寻找这些信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.