无法在双缓冲形式上绘制

Can't draw on double buffered form

在我的表单 class 中,我覆盖了 OnPaint 方法

protected override void OnPaint(PaintEventArgs e)
{
    using (Graphics g = e.Graphics)
    {
        g.DrawImage(player.Sprite, new Rectangle(player.X, player.Y, 20, 20));
    }
    base.OnPaint(e);
}

我有一个计时器,它在 Tick 上执行 this.Invalidate(),并且图像在闪烁。我在表单构造函数中设置了 this.DoubleBuffered = true,现在我的表单甚至不显示任何内容,如果我调整它的大小,它的行为如下:

我缺少的那个双缓冲区是什么?

using (Graphics g = e.Graphics)

using 关键字是此代码中的错误。本质上它杀死了双缓冲区,正常的绘画周期无法继续。其中 "normal" 是在您的 OnPaint() 方法完成 之后 被 blit 到屏幕的缓冲区内容。这搞砸了 背景的渲染,这就是为什么你看到显示器的背面,而前景,你画的图像。

using(或调用 Dispose)的黄金法则是您只应在创建对象时执行此操作。如果你没有,就像你在这种情况下没有,那么你不能假设你 "own" 对象并且你必须依赖代码的调用者来处理它。就是这样,不用帮忙。

修复:

e.Graphics.DrawImage(player.Sprite, new Rectangle(player.X, player.Y, 20, 20));
base.OnPaint(e);