Dev*_*ned 3 c# paint panel paintevent winforms
如何将面板重漆成光滑的?
我使用的计时器panel1.Invalidate();每 300 毫秒使面板 () 失效,然后当panel1_Paint我向该面板添加图像时,问题是它看起来像是在跳跃,我需要以最快的速度在其上移动一个图像能。
这是截屏问题的链接:http://screencast.com/t/HdtIV99YN
private void panel1_Paint(object sender, PaintEventArgs e)
{
PaintMapObstacles(e);
PaintMapStartAndGoal(e);
if (trayectoryIndex < 1000)
{
MapPoint point = GetTrayectoryPoint(0, trayectoryIndex);
e.Graphics.DrawImage(new Bitmap("robot.jpg"), point.X*squareSize, point.Y*squareSize, 60, 60);
trayectoryIndex++;
}
}
private void PaintMapStartAndGoal(PaintEventArgs e)
{
MapPoint start = new MapPoint { X = 0, Y = 0 };
MapPoint goal = new MapPoint { X = 7, Y = 8 };
// e.Graphics.DrawImage(new Bitmap("start.jpg"), start.X * squareSize, start.Y * squareSize, 60, 60);
e.Graphics.DrawImage(new Bitmap("goal.jpg"), goal.X * squareSize, goal.Y * squareSize, 60, 60);
isFirstRun = true;
}
private void PaintMapObstacles(PaintEventArgs e)
{
foreach (MapPoint mpoint in obstacles.Obstacles)
{
e.Graphics.DrawImage(new Bitmap("obstacle.png"), mpoint.X * squareSize, mpoint.Y * squareSize, 60, 60);
}
}
private void PanelTimer_Tick(object sender, EventArgs e)
{
panel1.Invalidate();
}
Run Code Online (Sandbox Code Playgroud)
它被称为“闪烁”,当您从头开始重新粉刷窗户时,这种现象始终存在。这在你的程序中尤其明显,因为你的绘画代码效率很低。您会看到窗口的背景被绘制,擦除了旧的绘画。然后慢慢地将位图绘制回背景上。擦除步骤是肉眼可见的并且看起来像闪烁。
闪烁的一般解决方法是双缓冲,首先将窗口内容组合成位图,然后快速将位图传输到屏幕。它是 Winforms 的内置功能,DoubleBuffered 属性可将其打开。默认情况下,Panel 类不启用双缓冲,它被设计为一个容器控件,除了绘制背景之外,不会自行进行绘制。PictureBox 在您的情况下也能正常工作,它默认启用双缓冲。或者您可以为 Panel 类打开双缓冲,如下所示。
您确实希望最终解决绘画代码的问题,除了速度非常慢之外,它还可能导致程序崩溃并出现 OutOfMemoryException。由于 Bitmap 类的使用方式引起的问题,应在使用后处理。始终对 System.Drawing 对象使用using语句。
只需创建一次位图即可使其速度更快,表单构造函数是最好的地方。通过预先缩放位图以适应网格并注意像素格式,可以使速度变得非常快。PixelFormat.Format32bppPArgb 直接兼容几乎所有现代视频适配器的帧缓冲区格式,位图可以直接复制到帧缓冲区中而无需转换。比所有其他格式快十倍。转换代码在这里。