如何:在 Windows 窗体中复制像素以减少闪烁

在对简单图形进行动画处理时,用户有时会看见闪烁或其他不需要的视觉效果。 限制此问题的一种方法是在图形上使用“bitblt”进程。 Bitblt 是颜色数据从像素的原始矩形到像素的目标矩形的“位块传送”。

使用 Windows 窗体时,bitblt 是使用 Graphics 类的 CopyFromScreen 方法完成的。 在方法的参数中,指定源和目标(作为点)、要复制区域的大小以及用于绘制新形状的图形对象。

以下示例在其 Paint 事件处理程序的窗体上绘制了一个形状。 然后,使用 CopyFromScreen 方法复制该形状。

注意

将窗体的 DoubleBuffered 属性设置为 true,将对 Paint 事件中基于图形的代码进行双缓存处理。 虽然在使用以下代码时,这样做不会有任何明显的性能提升,但在处理更复杂的图形操作代码时,需要记住这一点。

示例

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

编译代码

上面的代码在窗体的 Paint 事件处理程序中运行,以便在重新绘制窗体时保留图形。 因此,请勿在 Load 事件处理程序中调用图形相关方法,因为当重设窗体大小或窗体被另一个窗体遮盖时,将不会重绘已绘制的内容。

另请参阅