Практическое руководство. Копирование пикселов для уменьшения эффекта дрожания изображения в Windows Forms

Обновлен: Ноябрь 2007

При создании простых анимированных изображений могут появиться мерцание или другие нежелательные визуальные эффекты. Один из способов ограничения этих эффектов — применение к изображению процесса bitblt. Функция Bitblt выполняет перемещение набора битов с информацией о цвете из исходного прямоугольника точек в конечный прямоугольник.

В Windows Forms для реализации функции bitblt используется метод CopyFromScreen класса Graphics. В списке параметров метода указываются координаты исходной и конечной областей (в виде точек), размер копируемой области и графический объект, с помощью которого рисуется новая форма.

В следующем примере рисование фигуры на форме происходит в обработчике события Paint этой формы. После этого фигура копируется с помощью метода CopyFromScreen.

db8dsek8.alert_note(ru-ru,VS.90).gifПримечание.

Установка значения свойства DoubleBuffered формы равным true включает двойную буферизацию для кода обработки графики в обработчике события Paint. Хотя использование такого подхода в приведенном ниже коде не дает заметного выигрыша в производительности, о нем все равно стоит помнить при работе с кодом, управляющим более сложными графическими конструкциями.

Пример

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
    System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    ' Draw a circle with a bar on top.
        e.Graphics.FillEllipse(Brushes.DarkBlue, New Rectangle _
             (10, 10, 60, 60))
        e.Graphics.FillRectangle(Brushes.Khaki, New Rectangle _
             (20, 30, 60, 10))
    ' Copy the graphic to a new location.
        e.Graphics.CopyFromScreen(New Point(10, 10), New Point _
             (100, 100), New Size(70, 70))
End Sub
private void Form1_Paint(System.Object sender,
    System.Windows.Forms.PaintEventArgs e)
        {
        e.Graphics.FillEllipse(Brushes.DarkBlue, new
            Rectangle(10,10,60,60));
        e.Graphics.FillRectangle(Brushes.Khaki, new
            Rectangle(20,30,60,10));
        e.Graphics.CopyFromScreen(new Point(10, 10), new Point(100, 100), 
            new Size(70, 70));
}

Компиляция кода

Приведенный выше код выполняется в обработчике события Paint формы, поэтому изображение остается и после перерисовки формы. По этой причине не стоит вызывать методы, связанные с графикой в обработчике события Load, поскольку нарисованные элементы не будут перерисовываться при изменении размера формы, или если форма будет закрыта другой формой.

См. также

Ссылки

CopyPixelOperation

Graphics.FillRectangle

Control.OnPaint

Другие ресурсы

Объекты Graphics и Drawing в Windows Forms

Рисование линий и фигур с помощью пера