2011-05-11 151 views
-1

可能顯示的文件:
How do I double buffer a Panel in C#?
c# panel for drawing graphics and scrolling在c#雙緩衝

我繪製位圖在面板上,我使用縮放同一面板上。縮放面板時會持續閃爍。爲什麼面板沒有DoubleBuffered屬性?

代碼:

   Graphics g = Graphics.FromHwnd(panel.Handle); 
       if (newImage == true) 
       { 
        g.Clear(SystemColors.Control); 
        newImage = false; 
       } 

       g.DrawImage(bmp, hOffset, vOffset); 
       g.Dispose(); 
+0

檢查接受的答案這裏更好的選擇,這裏面的代碼:http://stackoverflow.com/questions/3718380/winforms-double-buffering – 2011-05-11 11:47:39

+0

你可以在你的問題中編寫代碼嗎? – Saleh 2011-05-11 12:02:40

+0

我已更新我的答案。 – Saleh 2011-05-11 13:34:12

回答

0

你在哪裏畫的位圖?

如果沒有在Paint事件或OnPaint覆蓋,那麼它是錯誤的。

要回答你的問題,只有表格有DoubleBuffered屬性,IIRC。

+0

我使用Paint事件。 :)。那我該如何避免閃爍? – 2011-05-11 11:46:28

+0

如果你自己做所有的繪圖,你可以創建自己的雙緩衝區,創建一個與面板大小相同的位圖,然後繪製該位圖,然後將位圖繪製到面板上。 – Peter 2011-05-11 11:49:22

-1

我不是100%確定,但你不能激活表單/窗口上的DoubleBuffered?

如果你打算使用與效果貴很多,我會用WPF,而不是去的WinForms一個提示..

您也可以重寫的OnPaint和OnPaintBackground ..

+0

使窗體/緩衝不會爲該窗體/窗口上的控件執行任何操作。我不認爲放大圖像會算「很多效果」; WinForms對此很好。在這裏重寫'OnPaint'和'OnPaintBackground'有什麼好處? – 2011-05-11 11:49:03

+0

看看我張貼在@leppie文章上的評論... – Peter 2011-05-11 14:31:28

+0

對另一個答案所做的評論確實沒有多少改進你自己的答案。 – 2011-05-12 03:33:04

1

使用本。

System.Drawing.BufferedGraphics 

我是一個遊戲developer.In遊戲,我們先畫一個後備緩衝中的所有對象,然後複製或將其翻轉到frontbuffer.You可以使用

System.Drawing.BufferedGraphics 

爲後備緩衝,並使它對圖形對象。

System.Drawing.Graphics 

例如:

 System.Drawing.Graphics g = this.CreateGraphics(); 
     System.Drawing.BufferedGraphicsContext dc = new BufferedGraphicsContext(); 
     BufferedGraphics backbuffer = dc.Allocate(g, new Rectangle(new Point(0, 0), g.VisibleClipBounds.Size.ToSize())); 
     backbuffer.Graphics.DrawImage(Image.FromFile(@"c:\test.jpg"), new Point(10, 10)); 
     backbuffer.Render(g); 
+0

我收到一條錯誤消息**沒有足夠的存儲可用於處理此命令** – 2011-05-11 12:14:07

+0

我已更新我的答案。 – Saleh 2011-05-11 13:30:25

1

添加構造

this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.DoubleBuffer, true); 
+0

*哪個*構造函數?對窗體進行雙緩衝不會對面板控件中的閃爍產生任何影響。您必須繼承Panel類,並將此代碼放置在您的自定義類的構造函數中。缺少更多信息,這不是一個非常有用的答案。 – 2011-05-11 11:54:46

+0

它不起作用。 :) – 2011-05-11 12:03:18