在我的表单类中,我已经覆盖了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
,现在我的表单甚至没有显示任何内容,如果我调整它的大小,它的行为如下:
我错过了什么双缓冲?
答案 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);