【问题标题】:C# Double Buffered not paintingC#双缓冲不绘画
【发布时间】: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


【解决方案1】:

删除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);
}

【讨论】:

    【解决方案2】:

    你应该注释掉下面的代码

    //panelMap.Invalidate();
    

    根据MSDN

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

    【讨论】:

    • 不要“注释掉”除测试目的之外的任何代码。源代码中的注释是为代码的人类读者提供的,告诉他们为什么要这样编写代码。如果部分代码是不必要的甚至是错误的,只需将其删除!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2011-03-05
    • 2011-10-16
    • 2012-12-18
    • 2020-04-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多