C#Double缓冲不绘画

时间:2014-03-05 05:15:59

标签: c# doublebuffered onpaint

我模拟地图导航并在面板上绘制生成的地图部分。由于图像闪烁,我必须使用双缓冲。

这是我的面板代码:

public class MapPanel : System.Windows.Forms.Panel
    {
        public MapPanel()
        {
            DoubleBuffered = true;
            ResizeRedraw = true;
        }
    }

我有以下方法:

public void panelMap_Paint(object sender, PaintEventArgs e)
        {
            using (Graphics g = e.Graphics)
            {
                g.DrawImage(mapController.GetCurrentMap(), 0, 0, panelMap.Width, panelMap.Height);
            }
        }

我不是在说这种方法。我在.Designer.cs中有以下代码:

this.panelMap.Paint += new PaintEventHandler(this.panelMap_Paint);

并在MouseMove中调用Invalidate()。我确定发生了这个事件,我已经检查过了。一切似乎都是正确的。

然后图像没有绘制。我的意思是,面板是空的,似乎是透明的或者是默认的控件颜色。但是,如果我关闭双缓冲,图像被正确绘制,但显然,它是闪烁的。你能帮帮我吗?

2 个答案:

答案 0 :(得分:5)

删除using声明。在用于绘制到屏幕之前,您将处置Graphics对象。

如上所述,您还应该从paint方法中删除Invalidate()调用。

public void panelMap_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    g.DrawImage(mapController.GetCurrentMap(), 0, 0, panelMap.Width, panelMap.Height);
}

答案 1 :(得分:0)

您应该注释掉以下代码

//panelMap.Invalidate();

根据MSDN

Invalidates the entire surface of the control and causes the control to be 
redrawn.