Como copiar pixels para reduzir a cintilação nos Windows Forms
Quando você anima um gráfico simples, os usuários podem, às vezes, encontrar cintilação ou outros efeitos visuais indesejáveis. Uma maneira de limitar esse problema é usar um processo "bitblt" 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, a transferência de bits é realizada usando o método CopyFromScreen da classe Graphics. 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 a seguir, uma forma é desenhada no formulário no manipulador de eventos Paint dele. Em seguida, o método CopyFromScreen é usado para duplicar a forma.
Nota
Definir a propriedade DoubleBuffered do formulário como true
fará com que o código baseado em gráficos no evento Paint seja em buffer duplo. Embora isso não tenha ganhos de desempenho perceptíveis ao usar o código abaixo, é algo a ter em mente ao trabalhar com um código de manipulação de elementos 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 eventos Paint do formulário para que os elementos gráficos persistam quando o formulário é redesenhado. Dessa forma, não chame métodos relacionados a elementos gráficos no manipulador de eventos Load, pois o conteúdo desenhado não será redesenhado se o formulário for redimensionado ou obscurecido por outro formulário.
Consulte também
.NET Desktop feedback