簡體   English   中英

在.Net應用程序中使用OnPaint的正確方法是什么?

[英]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子控件時 ,都會執行Form1OnPaint 例如,如果你在畫的右上角點Form1使用OnPaintForm1 ,當你有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之前在代碼中的其他位置添加控件。 例如,將重定位/調整大小代碼放在OnLayoutOnResize或類似事件中。 如果您仍然認為必須將重定位/調整大小代碼放在OnPaint事件中以使應用程序正常工作,那么您需要修改代碼的邏輯。
    • 在對自己的類之外的控件上調用Refresh()之前,請考慮System.Math.Pow(2,2)。 如果您有調用Refresh的沖動,您可能需要新事件和事件處理程序以與您願意顯示的內容保持同步。 Invalidate()也是如此。
    • 要檢查您是否有效地繪圖,您可以執行以下操作。 1.打開你的應用程序2.在最頂級的父級上的OnPaint上放置一個制動點3.最大化一個窗口,使其覆蓋你的應用程序。 4.再次最小化窗口,您的應用程序將通過控件重繪控件。 如果事情被畫了兩倍,那么你在應用程序的邏輯上就犯了一個錯誤。

嗯,我想這就是全部,如果有什么想到我忘了,我會更新這個問答。 如果我忘記了什么,或者我犯了錯誤,我很樂意留意它!

希望這會讓某人在.Net中使用自定義繪畫的東西,因為我不久前正在尋找這些信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM