Mik*_*erk 3 .net performance onpaint
有时我需要一个自定义的控件外观.或者做很多自定义绘画.我知道我可以这样做OnPaint(参见:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx)
使用OnPaint?net应用程序自定义绘制内容的正确方法是什么?是否有任何规则需要记住以保持我的应用程序优化,并将渲染时间保持在最低限度?
注意:我已经看到并且经历过OnPaint的许多低效使用,因此我创建了这个问答.
Mik*_*erk 10
要OnPaint有效地使用,您必须了解一些事情:
OnPaint控制,例如的Form1,是每次执行的控制是画(duhh ...)OnPaint的Form1是,每次执行一个子控件的Form1绘制.例如,如果您在Form1使用OnPaintof的右上角画一个点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中使用自定义绘画的东西,因为我不久前正在寻找这些信息.
| 归档时间: |
|
| 查看次数: |
2427 次 |
| 最近记录: |