저는 C#/Net에서 간단한 벡터 드로잉 앱을 만들고 있습니다. 드로잉은 패널에서 수행되지만 OnPaint() 이벤트를 사용하지는 않습니다. 실제로 OnPaint()는 실제로 문서의 모든 내용을 실제로 그리는 다른 메서드를 호출하기도합니다.OnPaint()에서 그리지 않을 때 이중 버퍼링 : 왜 작동하지 않습니까?
이중 버퍼링을 추가하려고했지만 DoubleBuffered를 true로 설정하면 깜박임 문제가 더욱 심각해졌습니다. 왜 이런거야? 컨트롤을 두 번 버퍼링하려면 Panel.CreateGraphics()를 사용하는 대신 제공된 Graphics 객체를 사용하여 OnPaint() 이벤트에서 모든 드로잉을 수행해야합니다.
편집 : 이것은 내가 사용하고있는 기본 코드입니다.
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와 및 오프셋은 UI에서 줌 레벨과 팬 수준을 참조한다는 것입니다. g는 Graphics 객체입니다.
패널의 페인트 이벤트 핸들러에 코드를 게시 할 수 있으며 함수를 호출 할 수 있습니까? – Brandi
예, 글로벌 Graphics 객체를 갖는 대신 글로벌 비트 맵을 사용하십시오. 또한 PaintEventArgs e를 사용하면 "doc.CreateGraphics();"라고 말할 필요가 없습니다. 당신은 단지 "e.Graphics"라고 말할 수 있습니다. – Brandi
만약 당신이 unmanaged 솔루션을보세요 신경 : http://stackoverflow.com/questions/2682025/disable-painting-of-the-vscrollbar-in-a-system-windows-forms-richtextbox (허용 대답) 그것은 종종 나를 위해 일했습니다. –