Vorgehensweise: Kopieren von Pixeln zum Vermindern des Flackerns in Windows Forms

Wenn Sie eine einfache Grafik animieren, können Benutzer manchmal auf Flimmern oder andere unerwünschte visuelle Effekte stoßen. Eine Möglichkeit, dieses Problem einzuschränken, besteht darin, einen „bitblt“-Prozess auf die Grafik anzuwenden. Bitblt ist die „Bitblockübertragung“ der Farbdaten aus einem Ursprungsrechteck von Pixeln in ein Zielrechteck von Pixeln.

Bei Windows Forms wird bitblt mithilfe der CopyFromScreen-Methode der Graphics-Klasse erzielt. In den Parametern der Methode geben Sie die Quelle und das Ziel (als Punkte), die Größe des zu kopierenden Bereichs und das Grafikobjekt an, das zum Zeichnen der neuen Form verwendet wird.

Im folgenden Beispiel wird eine Form im Formular in seinem Paint-Ereignishandler gezeichnet. Anschließend wird die CopyFromScreen-Methode verwendet, um die Form zu duplizieren.

Hinweis

Wenn Sie die DoubleBuffered-Eigenschaft des Formulars auf true festlegen, wird grafikbasierter Code im Paint-Ereignis doppelt gepuffert. Dies hat zwar keine erkennbaren Leistungsvorteile bei der Verwendung des folgenden Codes, aber es ist etwas, das sie beim Arbeiten mit komplexeren Grafikbearbeitungscode im Hintergkopf behalten sollten.

Beispiel

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));  
}  

Kompilieren des Codes

Der obige Code wird im Paint-Ereignishandler des Formulars ausgeführt, sodass die Grafiken erhalten bleiben, wenn das Formular neu gezeichnet wird. Rufen Sie also keine grafikbezogenen Methoden im Load-Ereignishandler auf, da der gezeichnete Inhalt nicht neu gezeichnet wird, wenn die Größe des Formular geändert oder es durch ein anderes Formular verdeckt wird.

Weitere Informationen