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

Mise à jour : novembre 2007

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

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

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

Remarque :

L'affectation à la propriété DoubleBuffered du formulaire de la valeur true permettra de mettre deux fois en mémoire tampon le code de graphiques figurant dans l'événement Paint. Cela ne permettra pas d'améliorer les performances de façon significative lors de l'utilisation du code ci-dessous, mais vous pourrez en tenir compte lorsque vous utiliserez du code plus complexe pour la manipulation graphique.

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 Paint du formulaire afin que les graphiques persistent si le formulaire est redessiné. Par conséquent, vous ne devez pas appeler de méthodes graphiques dans le gestionnaire d'événements Load, car les dessins ne seront pas redessinés si le formulaire est redimensionné ou masqué par un autre formulaire.

Voir aussi

Référence

CopyPixelOperation

Graphics.FillRectangle

Control.OnPaint

Autres ressources

Graphiques et dessins dans les Windows Forms

Utilisation d'un stylet pour dessiner des lignes et des formes