2017-06-04 58 views
0

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

我有一个计时器,那确实对Tickthis.Invalidate()和图像闪烁。我给自己定的形式构造this.DoubleBuffered = true,现在我的状态甚至不显示任何东西,如果我调整它的大小,它的行为是这样的:

1

那是什么,我很想念双缓存的事情?

+1

什么是定时器的时间间隔? –

+0

@TimonPost 25ms,约为。 40帧每秒 –

+1

虽然这不是你的问题,但使用(Graphics g = e.Graphics)是无意义的代码。 'e.Graphics'已经*了* Graphics'对象;直接使用它。至于你的实际问题,闪烁可能是被擦除的背景。考虑设置“ControlStyles.AllPaintingInWmPaint”和“ControlStyles.UserPaint”。这甚至可以避免需要双重缓冲。 –

回答

1
using (Graphics g = e.Graphics) 

using关键字是此代码中的错误。实质上,它杀死了双缓冲区,正常的喷涂周期无法继续。其中“正常”是缓冲区的内容在之后变为点到之后,您的OnPaint()方法完成。这会使都呈现背景的渲染,这就是为什么你会看到显示器的背面,以及前景,你画的图像。

对于using(或调用Dispose)的黄金法则是,您应该只在创建对象时才这样做。如果你没有,就像你没有在这种情况下那样,那么你不能认为你“拥有”了这个对象,并且你必须依靠你的代码的调用者来处理它。它做什么,不需要帮助。

修复:

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