【发布时间】:2014-04-07 00:06:15
【问题描述】:
我模拟地图导航并在面板上绘制生成的地图部分。由于图像闪烁,我必须使用双缓冲。
这是我的面板代码:
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()。我确定发生了这个事件,我已经检查过了。一切似乎都是正确的。
然后图像没有绘制。我的意思是,面板是空的,并且似乎是透明的或以默认控制颜色着色。但是,如果我关闭双缓冲,图像会正确绘制,但显然它会闪烁。你能帮帮我吗?
【问题讨论】:
-
你为什么在绘画事件处理程序中调用
panelMap.Invalidate();? -
哦,我的错,谢谢。然而,这对解决问题没有帮助。
-
尝试摆脱
using声明。您没有创建Graphics对象的实例,并且处理它可能会清除您在实际绘制到屏幕上之前所做的工作。 -
IDisposeable 对象的经验法则:如果您从函数中返回,请处置它(将其放在
using块中),如果您从属性中返回,请不要处置它(因为处置它是父对象的责任)
标签: c# doublebuffered onpaint