Используйте двойную буферизацию, чтобы предотвратить мерцание в PictureBox в C#

Пример Использование двойной буферизации для предотвращать мерцание при рисовании на C# показывает, как сделать форму, использующую двойную буферизацию для уменьшения мерцания. Вместо того, чтобы рисовать все на экране по мере его создания, форма рисует изображение в памяти и отображает результат только после завершения изображения.

Но что, если вы хотите только удвоить буфер PictureBox, а не всю форму? Элемент PictureBox не имеет свойства DoubleBuffered, как это делает форма. (Хотя, возможно, так и должно быть.)

К счастью, достаточно просто обеспечить двойную буферизацию. Просто создайте Bitmap в памяти и нарисуйте его. По завершении установите свойство PictureBox Изображение в Bitmap. Это не только предотвращает мерцание, но также позволяет PictureBox автоматически перерисовывать себя, когда это необходимо, без написания обработчика событий Paint.

К счастью, достаточно просто обеспечить двойную буферизацию. Просто создайте Bitmap в памяти и нарисуйте его. По завершении установите свойство PictureBox Изображение в Bitmap. Это не только предотвращает мерцание, но также позволяет PictureBox автоматически перерисовывать себя, когда это необходимо, без написания обработчика событий Paint.

...

Метод DrawCurves, показанный в следующем коде, рисует две кривые бабочки этого примера. PictureBox слева использует двойную буферизацию, а в правой - нет.

// Нарисуйте кривые бабочки на обоих PictureBoxes.
private void DrawCurves()
{
    // Очистите оба изображения.
    picCanvas1.Image = null;
    picCanvas2.Refresh();
    picCanvas1.Refresh();

    int wid = picCanvas2.ClientSize.Width;
    int hgt = picCanvas2.ClientSize.Height;

    // Рисование с двойной буферизацией.
    Bitmap bm = new Bitmap(wid, hgt);
    using (Graphics gr = Graphics.FromImage(bm))
    {
        DrawButterfly(gr, wid, hgt);
    }
    picCanvas1.Image = bm;
    picCanvas1.Refresh();

    // Рисование без двойной буферизации.
    DrawButterfly(picCanvas2.CreateGraphics(), wid, hgt);
}

Сначала код очищает элементы управления PictureBox. Обычно, когда вы дублируете буфер, вы пропускаете этот шаг. Вместо этого вы просто создаете новый Bitmap, а затем отображаете его, заменяя все, что отображалось ранее.

Далее код создает Bitmap и связанный с ним объект Graphics и вызывает метод DrawButterfly, чтобы нарисовать на нем кривую бабочки. Он устанавливает первый PictureBox 'Image свойство в Bitmap и обновляет его. В этом примере вы увидите кратковременное мерцание. Если вы не очистите PictureBox, вы ничего не заметите.

Код заканчивается вызовом DrawButterfly, чтобы нарисовать новую кривую бабочки на втором PictureBox. Он использует Graphics объект для PictureBox, поэтому пользователь видит изображение, когда программа рисует его, и есть много мерцания.

Источник: http://csharphelper.com/blog/2014/11/use-double-buffering-to-prevent-flicker-in-a-picturebox-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector