【发布时间】:2013-01-27 17:34:30
【问题描述】:
我曾尝试实现自定义双缓冲,但它会导致闪烁。
这是控件(继承自控件的自定义控件)构造函数中的代码:
bufferContext = new BufferedGraphicsContext();
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
SetStyle(ControlStyles.DoubleBuffer, false);
SetStyle(ControlStyles.ResizeRedraw, false);
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, true);
OnPaint 事件:
protected override void OnPaint(PaintEventArgs e)
{
if (buffer == null)
{
Draw(e);
return;
}
if (Repaint)
{
Repaint = false;
PaintEventArgs pe = new PaintEventArgs(buffer.Graphics, e.ClipRectangle);
Draw(pe);
}
buffer.Render(e.Graphics);
}
此外,此代码在与缓冲相关的调整大小时被激活:
Graphics g = this.CreateGraphics();
if (buffer != null)
{
buffer.Dispose();
buffer = null;
}
if (!(bufferContext == null || DisplayRectangle.Width <= 0 || DisplayRectangle.Height <= 0))
{
buffer = bufferContext.Allocate(g, DisplayRectangle);
Repaint = true;
}
Draw方法比较复杂,但是先用BackColor填充控件,其他无关。
我可以用我的眼睛发现有时会有闪烁,主要是在调整窗口大小时。据我所知,黑色首先在控件上绘制,然后是缓冲区中的图形,它会导致闪烁。但是,BackColor 永远不会是黑色的。
如何阻止这种情况?
【问题讨论】:
-
也覆盖 OnPaintBackground(),什么也不做。
-
已经试过了,没用。
标签: c# winforms double-buffering