【问题标题】:Double buffering with Panel面板双缓冲
【发布时间】:2011-11-26 00:51:50
【问题描述】:

可以通过将“AllPaintingInWmPaint”、“UserPaint”和“DoubleBuffer”ControlStyles 的值设置为“true”(this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true)) 来对整个表单进行双重缓冲。

但这不能发生在 System.Windows.Forms.Panel 上,因为该类不允许我这样做。我找到了一种解决方案:http://bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control。我也试过这个:Winforms Double Buffering。它很滞后,即使它用于小型绘图,我也有一些自定义资源用于表单和其他东西,因此我不会将整个表单变成一张绘图。第二个似乎会引起问题。还有其他方法吗?

我问这个是因为我不希望面板上的绘图在调整表单大小时一直闪烁。如果有办法在不使用双缓冲的情况下摆脱闪烁,我会很高兴知道。

【问题讨论】:

  • 我认为这取决于您要做什么。您是否尝试刷新数据或动画?你在尝试制作游戏吗?我记得使用 system.drawing 消除闪烁非常困难,即使使用双缓冲(有时帧速率非常慢,即使在双缓冲时也看起来像闪烁)
  • 这是一个在 WinForms 窗口中玩的游戏。图纸绘制在面板上。当用户单击面板时,绘图正在更改。但是当有滚动和调整大小的过程时,也会有闪烁。
  • 您可以在这里找到解决方案,它对我有用。 [解决方案][1][1]:stackoverflow.com/questions/16882921/…

标签: c# winforms panel system.drawing double-buffering


【解决方案1】:

我早就应该发布我的解决方案了...

好吧,这是我的解决方案:

Bitmap buffer = new Bitmap(screenWidth, screenHeight);//set the size of the image
System.Drawing.Graphics gfx = Graphics.FromImage(buffer);//set the graphics to draw on the image
drawStuffWithGraphicsObject(gfx);//draw
pictureBox1.Image = buffer;//set the PictureBox's image to be the buffer

在问了这个问题多年后才找到这个解决方案,这让我觉得自己像个彻头彻尾的白痴。

我已经在面板上尝试过,但事实证明在应用新图像时速度较慢。我在某处读过,最好使用 Panel 而不是 PictureBox。不过,我不知道是否必须在代码中添加一些内容以加快面板的速度。

【讨论】:

    【解决方案2】:

    如果您不需要滚动支持,请使用 PictureBox,默认情况下它是双缓冲的。获得双缓冲可滚动面板很容易:

    using System;
    using System.Windows.Forms;
    
    class MyPanel : Panel {
        public MyPanel() {
            this.DoubleBuffered = true;
            this.ResizeRedraw = true;
        }
    }
    

    ResizeRedraw 分配抑制了容器控件的绘画优化。如果您在面板中进行任何绘画,您将需要这个。没有它,当您调整面板大小时,绘画会模糊不清。

    双缓冲实际上使绘制速度变慢。这可能会对稍后绘制的控件产生影响。他们在被填满之前留下的洞可能会在一段时间内可见,也被认为是闪烁。您可以在this answer 中找到针对该效果的对策。

    【讨论】:

    • 我可以尝试摆脱一些控件,但它们不会很多...我将尝试创建一个新的 Panel 类并“解锁”一些 System.Windows.Forms。面板的功能。但感谢您的链接。这是一个方便的教程。
    • 汉斯,你怎么把旧面板换成这个新面板?我写了这个类,现在如何将它连接到我现有的panel1 以便获得上述属性?
    • 从您的表单中删除 panel1 并将其放到它的位置。您可以将其重命名为“panel1”以保持现有代码正常工作。
    • 我已经尝试过了,但在“panel1”s 之间出现了歧义错误
    【解决方案3】:

    如果可以接受,您可以在调整大小时停止刷新面板并在之后再次启用它,这样您就可以摆脱难看的闪烁。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 2013-10-20
      • 2010-10-23
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2011-03-05
      相关资源
      最近更新 更多