2011-05-11 152 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