簡體   English   中英

C#:從PictureBox刪除Paint事件

[英]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中執行以下步驟:

  1. DoubleBuffered屬性設置為True
  2. 始終檢查e.ClipRectangle屬性以獲取需要重繪的區域。 然后遍歷您的形狀集合,並為每個形狀嘗試確定我們是否與ClipRectangle相交。 我不知道您使用哪種形狀,但是大多數形狀(包括多邊形)都可以使用非常快速的實現,它可以檢查兩個多邊形是否相交。 關於多邊形交集一篇好文章,請在本文中 ,包括C#代碼。 (請注意,如果您的形狀是矩形,圓形或三角形,則相交問題的計算變得更加容易和快捷)
  3. 僅當形狀與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.ZoomImage.Save .。

暫無
暫無

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

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