我正在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