如何:在 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 事件处理程序中调用图形相关方法,因为如果窗体被调整大小或被其他窗体遮挡,则绘制的内容将不会被重新绘制。

另请参阅