我正在C#/。Net中开发一个简单的矢量绘图应用程序。绘制是在面板中完成的,但是我没有全部使用OnPaint()事件- 实际上,OnPaint()甚至只是调用了另一种实际上绘制文档中所有内容的方法。
我尝试添加双缓冲,但是当我将DoubleBuffered设置为true时,闪烁问题甚至更加严重。为什么是这样?如果我想对控件进行双缓冲,是否一定要使用提供的Graphics对象在OnPaint()事件中完成所有绘图,而不是使用Panel.CreateGraphics()然后进行绘制?
编辑:这是我正在使用的基本代码。
private void doc_Paint(object sender, PaintEventArgs e) { g = doc.CreateGraphics(); Render(ScaleFactor, Offset); } private void Render(float ScaleFactor, PointF offset) { foreach (Line X in Document.Lines) { DrawLine(X.PointA, X.PointB, X.Color, X.LineWidth); } } private void DrawLine(PointF A, PointF B, Color Color, float Width) { Pen p = new Pen(Color, Width); PointF PA = new PointF(((A.X + Offset.X) * ScaleFactor), ((A.Y + Offset.Y) * ScaleFactor)); PointF PB = new PointF(((B.X + Offset.X) * ScaleFactor), ((B.Y + Offset.Y) * ScaleFactor)); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.DrawLine(p, PA, PB); }
总体思路是,两个变量ScaleFactor和Offset引用UI中的缩放级别和平移级别。g是Graphics对象。
g = doc.CreateGraphics();
那是错误。只有当您拖入缓冲区时,双缓冲才能起作用。e.Graphics引用的那个。固定:
g = e.Graphics;
请注意,Panel默认情况下未启用双缓冲。您将需要派生自己的。将此粘贴到新类中:
using System; using System.Windows.Forms; class BufferedPanel : Panel { public BufferedPanel() { this.DoubleBuffered = true; this.ResizeRedraw = true; } }
编译。将其从工具箱的顶部放下。