无法在双缓冲形式上绘制
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);
在我的表单 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);