2010-03-16 17 views
0

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

我试着

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

的InitializeComponent()后,使该用户控制双缓冲,但它似乎并没有工作。

回答

3

这不是双缓冲可以解决的闪烁的来源。当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倍。

+0

这解决了我的问题,谢谢。 – user294720 2010-03-16 14:13:00