Como Copiar Pixels para Reduzir a Cintilação nos Windows Forms

Ao animar um gráfico simples, os usuários podem encontrar cintilação ou outro efeito visual indesejado. Uma forma de limitar esse problema é usar um processo de “transferência de bits” no gráfico. Transferência de bits é a "transferência de blocos de bit" dos dados de cor de um retângulo de pixels de origem para um retângulo de pixels de destino.

Com o Windows Forms, o bitblt é realizado usando o CopyFromScreenGraphics método da classe. Nos parâmetros do método, você especifica a origem e o destino (como pontos), o tamanho da área a ser copiada e o objeto gráfico usado para desenhar a nova forma.

No exemplo abaixo, uma forma é desenhada no formulário em seu Paint manipulador de eventos. Em seguida, o CopyFromScreen método é usado para duplicar a forma.

Observação

Definir a propriedade do DoubleBuffered formulário como true fará com que o Paint código baseado em elementos gráficos no evento seja armazenado em buffer duplo. Embora isso não tenha nenhum ganho de desempenho perceptível ao usar o código abaixo, é algo a ter em mente ao trabalhar com código de manipulação de gráficos mais complexo.

Exemplo

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

Compilando o código

O código acima é executado no manipulador de Paint eventos do formulário para que os elementos gráficos persistam quando o formulário é redesenhado. Como tal, não chame Load métodos relacionados a elementos gráficos no manipulador de eventos, porque o conteúdo desenhado não será redesenhado se o formulário for redimensionado ou obscurecido por outro formulário.

Confira também