我正在开发一个Windows窗体项目,并且遇到UserControl Double Buffering的一些问题。 我创建了一个usercontrol并有一个背景图像,然后在它上面我有几个单选按钮和标签。单选按钮和标签都具有透明背景作为颜色。 但是,当我显示并隐藏用户控件时,我可以看到那些具有透明背景的标签和单选按钮上的闪烁。
我试过
Me.SetStyle(ControlStyles.DoubleBuffer _
Or ControlStyles.AllPaintingInWmPaint _
Or ControlStyles.UserPaint _
Or ControlStyles.SupportsTransparentBackColor, _
True)
在initializeComponent()之后,在此用户控件上启用双缓冲区,但它似乎不起作用。
答案 0 :(得分: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倍。