我模拟地图导航并在面板上绘制生成的地图部分。由于图像闪烁,我必须使用双缓冲。
这是我的面板代码:
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()。我确定发生了这个事件,我已经检查过了。一切似乎都是正确的。
然后图像没有绘制。我的意思是,面板是空的,似乎是透明的或者是默认的控件颜色。但是,如果我关闭双缓冲,图像被正确绘制,但显然,它是闪烁的。你能帮帮我吗?
答案 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.