Instrukcje: kopiowanie pikseli w celu zmniejszenia migotania w formularzach systemu Windows
W przypadku animowania prostej grafiki użytkownicy mogą czasami napotykać migotanie lub inne niepożądane efekty wizualne. Jednym ze sposobów ograniczenia tego problemu jest użycie procesu "bitblt" na grafice. Bitblt to "transfer bloków bitowych" danych kolorów z prostokąta pochodzenia pikseli do docelowego prostokąta pikseli.
W przypadku formularzy systemu Windows bitblt jest realizowane przy użyciu metody CopyFromScreen klasy Graphics. W parametrach metody należy określić źródło i miejsce docelowe (jako punkty), rozmiar obszaru do skopiowania oraz obiekt graficzny używany do rysowania nowego kształtu.
W poniższym przykładzie kształt jest rysowany na formularzu w obsłudze zdarzenia Paint. Następnie metoda CopyFromScreen jest używana do duplikowania kształtu.
Notatka
Ustawienie właściwości DoubleBuffered formularza na wartość true
spowoduje, że kod oparty na grafice w zdarzeniu Paint zostanie dwukrotnie buforowany. Chociaż nie będzie to miało żadnej zauważalnej poprawy wydajności podczas korzystania z poniższego kodu, należy o tym pamiętać przy pracy z bardziej złożonym kodem do manipulowania grafiką.
Przykład
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));
}
Kompilowanie kodu
Powyższy kod jest uruchamiany w procedurze obsługi zdarzeń Paint formularza, tak aby grafika utrzymywała się podczas ponownego rysowania formularza. W związku z tym nie należy wywoływać metod związanych z grafiką w programie obsługi zdarzeń Load, ponieważ narysowana zawartość nie zostanie ponownie wyrysowana, jeśli rozmiar formularza zostanie zmieniony lub zaciemniany przez inny formularz.
Zobacz też
.NET Desktop feedback