Поделиться через


Практическое руководство. Копирование пикселей для уменьшения мерцания в Windows Forms

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

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

В приведенном ниже примере фигура рисуется на форме в обработчике событий Paint. Затем метод CopyFromScreen используется для дублирования фигуры.

Замечание

Установка свойства 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, так как рисованное содержимое не будет перезаписано, если форма изменена или скрыта другой формой.

См. также