无法在双缓冲表单上绘制

时间:2017-06-04 11:02:54

标签: c# .net graphics drawing

在我的表单类中,我已经覆盖了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);
}

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

1

我错过了什么双缓冲?

1 个答案:

答案 0 :(得分:1)

using (Graphics g = e.Graphics)

using关键字是此代码中的错误。本质上它杀死了双缓冲区,并且正常的绘制周期无法继续。在哪里"正常"是在您的OnPaint()方法完成后,缓冲区的内容是否已插入到屏幕中。这会搞砸两个背景的渲染,这就是你看到显示器背面和前景,你画的图像的原因。

using(或调用Dispose)的黄金法则是您在创建对象时应该只执行此操作。如果你没有,就像你在这种情况下没有那样,那你就不能认为你已经拥有了#34;对象,您必须依赖代码的调用者来处理它。这样做,无需帮助。

修正:

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