Двойная буферизация, если не тянущая в OnPaint (): почему это не работает?

Я работаю над приложением рисования простого вектора в C#/.Net. Рисунок сделан в панели, но я не использую событие OnPaint() для всего этого - на самом деле, OnPaint () даже просто называет другой метод, который на самом деле тянет все в документе.

Я пытался добавить двойную буферизацию, но когда я установил DoubleBuffered на истинный, проблема мерцания еще хуже. Почему это? Если я хочу к двойному буферу управление, сделайте я абсолютно должен сделать весь свой рисунок в событии OnPaint(), с предоставленным Графическим объектом, вместо того, чтобы использовать Панель. 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 и Смещение, относятся к уровню масштабирования и уровню панорамирования в UI. g является Графическим объектом.

9
задан ian93 24 June 2010 в 19:35
поделиться

2 ответа

g = doc.CreateGraphics();

Это ошибка. Двойная буферизация может работать только в том случае, если вы рисуете в буфере. Тот, на который ссылается e.Graphics. Исправление:

g = e.Graphics;

Остерегайтесь, что панель не имеет двойной буферизации, включенной по умолчанию. Вам нужно будет вывести свой собственный. Вставьте его в новый класс:

using System;
using System.Windows.Forms;

class BufferedPanel : Panel {
    public BufferedPanel() {
        this.DoubleBuffered = true;
        this.ResizeRedraw = true;
    }
}

Compile. Опустите его из верхней части панели инструментов.

29
ответ дан 4 December 2019 в 07:22
поделиться

Лично я не заморачиваюсь с параметром DoubleBuffered. Я просто рисую все в битмап, а затем в событии paint рисую этот битмап на экране.

Bitmap BackBuffer;

private void MainFormSplitContainerPanel1Paint(object sender, PaintEventArgs e)
{
    e.Graphics.Clear(MainFormSplitContainer.Panel1.BackColor);
    if (BackBuffer != null)
        e.Graphics.DrawImage(BackBuffer, positionX, positionY, SizeX, SizeY);
}
1
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: