[英]call Paint event of picturebox from PageLoad in C# causes an error
[英]C# : Remove Paint Event from PictureBox
對不起,我的英語不好。
我有一個畫框,可在其中繪制100000個形狀(但可能還有更多)。 在圖片框的“繪制處理程序”中繪制圖形。
問題是:當我調整窗體的大小(圖片框所在的位置)時,使用包含該窗體的面板的滾動條(來自另一個應用程序)...繪制處理程序被稱為...但是繪制過程需要相當長的時間用戶必須等到油漆塗完為止。
我嘗試了以下方法:
注意:圖片框的大小和內容可以更改,因此位圖也必須更改。 位圖的創建+位圖的還原使應用程序比以前慢:
Bitmap bmp = new Bitmap(picturebox.Width, picturebox.Height);
// draw in Graphics.FromImage(bmp);
picturebox.Invalidate();
bmp.Dispose();
我還嘗試了一個布爾標志:canRedraw。 當圖片框的內容更改時,將其設置為true,然后調用picturebox.Invalidate()。 在繪制處理程序中,我檢查是否(canRedraw),如果是,則重繪內容(並且canRedraw = false),否則我什么也沒做。 但是使用最后一種解決方案,當我使用表單制作東西時,我的圖片框被清除了...
您對我如何做到這一點有任何想法:
如果您使用的是更改圖片框內容的方法,則可以重新繪制圖片框,否則您將圖片框的視覺內容保持不變 。
你能幫助我嗎 ?
非常感謝你 :)
如果您沒有使用PictureBox
任何其他功能,請嘗試用您自己的UserControl替換它。 然后在您的UserControl中執行以下步驟:
DoubleBuffered
屬性設置為True
。 e.ClipRectangle
屬性以獲取需要重繪的區域。 然后遍歷您的形狀集合,並為每個形狀嘗試確定我們是否與ClipRectangle
相交。 我不知道您使用哪種形狀,但是大多數形狀(包括多邊形)都可以使用非常快速的實現,它可以檢查兩個多邊形是否相交。 關於多邊形交集一篇好文章,請在本文中 ,包括C#代碼。 (請注意,如果您的形狀是矩形,圓形或三角形,則相交問題的計算變得更加容易和快捷) ClipRectangle
相交時才繪制形狀。 除了將Paint
簡化為dotNet建議以外,另一種方法是嘗試做的,但是您需要正確地做:
是的, 確實要繪制一個Bitmap
但不要在“ Paint
事件中Paint
,這將被不必要地調用,但是仍然花費太多時間! 相反, 僅當您知道數據已更改並且需要重繪時才繪制!
您並沒有告訴我們您所繪制的內容,但是繪制應該像這樣進行:
void drawStuff()
{
Bitmap bmp = new Bitmap(pictureBox.ClientSize.Width, pictureBox.ClientSize.Height);
using (Graphics G = Graphics.FromImage(bmp) )
{
// do all your drawing stuff here!!
}
pictureBox.Image = bmp;
}
每當您想再次繪制數據時都調用此函數!
現在,您可以將Paint
事件保留為空,因為Image
如果已由系統緩沖,則仍然可以使用PictureBox.Zoom
或Image.Save
.。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.