我正在C#/ .Net中创建一个简单的矢量绘图应用程序。该绘图是在一个面板中完成的,但是我没有使用OnPaint()事件 - 事实上,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对象。
你可以在你的面板的paint事件处理程序中发布代码以及它调用的任何函数吗? – Brandi 2010-06-24 19:21:43
是的,而不是有一个全局的图形对象,有一个全局位图。另外,当你有PaintEventArgs时,你不必说“doc.CreateGraphics();”你可以说“e.Graphics”; – Brandi 2010-06-24 19:54:33
如果您不介意ummanaged解决方案看这里:http://stackoverflow.com/questions/2682025/disable-painting-of-the-vscrollbar-in-a-system-windows-forms-richtextbox(接受的答案)这通常对我有用。 – 2010-06-24 20:25:58