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