1

我正在开发一个 Windows 窗体项目,并且在 UserControl 双缓冲方面遇到了一些问题。我创建了一个用户控件并有一个背景图像,然后在它上面我有几个单选按钮和标签。单选按钮和标签都具有透明背景作为颜色。但是,当我显示和隐藏用户控件时,我可以看到那些具有透明背景的标签和单选按钮上的闪烁。

我试过了

Me.SetStyle(ControlStyles.DoubleBuffer _
Or ControlStyles.AllPaintingInWmPaint _
Or ControlStyles.UserPaint _
Or ControlStyles.SupportsTransparentBackColor, _
True)

在 initializeComponent() 在此用户控件上启用双缓冲区之后,它似乎不起作用。

4

1 回答 1

4

这不是双缓冲可以解决的闪烁源。当 UC 重新绘制自身时,它会绘制背景图像,在控件所在的位置留下孔。然后每个控件都开始绘制自己,首先要求 UC 再次绘制自身以产生背景像素,然后在顶部绘制自己来填充空洞。临时孔是你看到的闪烁。

您可以通过允许 UC 在控件的客户区域中绘制自身来使其不那么令人反感,因此背景已经正确设置。将此代码粘贴到 UserControl 类中:

protected override CreateParams CreateParams {
  get {
    var parms = base.CreateParams;
    parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
    return parms;
  }
}

这不会使绘画变得更快,并且可能会产生副作用。如果这仍然是一个问题,那么您需要加快 BackgroundImage 的绘制速度。将其预缩放为用户控件的客户端大小,以便无需重新缩放即可绘制它。对位图使用 PixelFormat.Format32bppPArgb 格式,它比大多数视频适配器上的任何其他格式快约 10 倍。

于 2010-03-16T13:10:55.630 回答