可以通过将“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 .它很慢,即使它被用在一张小图上,我有一些我在表单和其他东西中使用的自定义资源,因此我不会把整个表单变成一张图。第二个似乎会引起问题。还有其他方法吗?
我问这个是因为我不希望面板上的绘图在调整表单大小时一直闪烁。如果有一种无需双缓冲即可消除闪烁的方法,我将很高兴知道。
最佳答案
如果不需要滚动支持,请使用 PictureBox,默认情况下它是双缓冲的。获得双缓冲的可滚动面板非常简单:
using System;
using System.Windows.Forms;
class MyPanel : Panel {
public MyPanel() {
this.DoubleBuffered = true;
this.ResizeRedraw = true;
}
}
ResizeRedraw 赋值抑制了容器控件的绘画优化。如果您在面板中进行任何绘画,您将需要它。没有它,当您调整面板大小时,绘画会弄脏。
双缓冲实际上会使绘画变慢。这会对稍后绘制的控件产生影响。它们在被填充之前留下的空洞可能会在一段时间内可见,也被视为闪烁。您会在 this answer 中找到针对该影响的对策。 .
关于c# - 面板双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569471/