Comment : copier des pixels pour réduire le scintillement dans les Windows Forms

Lorsque vous animez un graphique simple, les utilisateurs peuvent parfois rencontrer un scintillement ou d’autres effets visuels indésirables. Une façon de limiter ce problème consiste à utiliser un processus de « bitblt » sur le graphique. Bitblt est le « transfert de bloc de bits » des données de couleur d’un rectangle d’origine de pixels vers un rectangle de destination de pixels.

Avec Windows Forms, bitblt est accompli à l’aide de la CopyFromScreen méthode de la Graphics classe. Dans les paramètres de la méthode, vous spécifiez la source et la destination (en tant que points), la taille de la zone à copier et l’objet graphique utilisé pour dessiner la nouvelle forme.

Dans l’exemple ci-dessous, une forme est dessinée sur le formulaire dans son Paint gestionnaire d’événements. Ensuite, la CopyFromScreen méthode est utilisée pour dupliquer la forme.

Remarque

La définition de la propriété du DoubleBuffered formulaire pour true rendre le code graphique dans l’événement Paint à double mémoire tampon. Bien que cela n’ait pas de gains de performances discernables lors de l’utilisation du code ci-dessous, il est quelque chose à garder à l’esprit lors de l’utilisation de code de manipulation graphique plus complexe.

Exemple

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

Compilation du code

Le code ci-dessus est exécuté dans le gestionnaire d’événements du Paint formulaire afin que les graphiques persistent lorsque le formulaire est redessiné. Par conséquent, n’appelez pas de méthodes graphiques dans le Load gestionnaire d’événements, car le contenu dessiné ne sera pas redessiné si le formulaire est redimensionné ou masqué par un autre formulaire.

Voir aussi