[英]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.