Como: Copiar pixels para reduzir oscilação no Windows Forms

Ao animar um elemento gráfico simples, os usuários às vezes, poderá encontrar cintilação ou outros efeitos visuais indesejáveis.Uma maneira de limitar esse problema é usar um processo de "bitblt" no elemento gráfico.BitBlt é a "bloco de bit transferência" de dados de cores de um retângulo de origem de pixels a um retângulo de destino de pixels.

Com o Windows Forms, bitblt é realizado usando o CopyFromScreen método para o Graphics classe. Nos parâmetros do método, você especifica fonte e destino (sistema autônomo pontos), o dimensionar da área a ser copiado e o objeto de elementos gráficos usados para desenhar a nova forma.

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

Observação:

A definição do formulário DoubleBuffered propriedade para true fará com que códigos baseados em elementos gráficos na Paint evento ser armazenada em buffer duplo. Embora isso não terá qualquer ganhos de desempenho discernível ao usar o código a seguir, é algo que tenha 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 Paint evento manipulador para que os elementos gráficos persistirem quando o formulário é redesenhado. sistema autônomo tal, não telefonar métodos relacionados a elementos gráficos no Load manipulador de eventos, porque o conteúdo desenhado não será redesenhado se o formulário for redimensionado ou obscurecido por outro formulário.

Consulte também

Referência

CopyPixelOperation

Graphics.FillRectangle

Control.OnPaint

Outros recursos

Elementos gráficos e desenho em formulários do Windows

Usando uma caneta para desenhar linhas e formas