Procedimiento para copiar píxeles para reducir el parpadeo en formularios Windows Forms

Al animar un gráfico sencillo, los usuarios a veces pueden experimentar parpadeo u otros efectos visuales no deseados. Una manera de limitar este problema es usar un proceso de "bitblt" en el gráfico. Bitblt es la "transferencia de bloques de bits" de los datos de color de un rectángulo de origen de píxeles a un rectángulo de destino de píxeles.

Con Windows Forms, bitblt se alcanza mediante el método CopyFromScreen de la clase Graphics. En los parámetros del método, debe especificar el origen y el destino (como puntos), el tamaño del área que se va a copiar y el objeto gráfico utilizado para dibujar la nueva forma.

En el ejemplo siguiente, se dibuja una forma en el formulario en su controlador de eventos Paint. Después, el método CopyFromScreen se usa para duplicar la forma.

Nota:

Establecer la propiedad DoubleBuffered del formulario en true hará que el código basado en gráficos en el evento Paint sea de doble búfer. Aunque esto no supondrá mejoras de rendimiento perceptibles al usar el código siguiente, es algo que debe tener en cuenta al trabajar con código de manipulación de gráficos más complejo.

Ejemplo

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

Compilar el código

El código anterior se ejecuta en el controlador de eventos Paint del formulario para que los gráficos se conserven cuando se vuelva a dibujar el formulario. Por lo tanto, no llame a métodos relacionados con gráficos en el controlador de eventos Load, ya que el contenido dibujado no se volverá a dibujar si otro formulario cambia de tamaño u oculta el formulario.

Consulte también