Практическое руководство. Копирование пикселов для уменьшения эффекта дрожания изображения в 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, так как рисованное содержимое не будет перерисовано, если форма изменяется или будет скрыта под другой формой.
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по