控件闪烁目前了解的原因无非是各个控件绘制的先后的问题导致的,解决绘制的问题推荐两个方式
1.双缓冲
可以在控件初始化设置,注意父窗体要设置运行允许双缓冲
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.UpdateStyles();
双缓存说白了就是先会绘制到缓存中,而不是直接绘制到屏幕。有些情况下感觉没有效果,其实不然,只是控件太多,我们不能保证每一控件都是双缓冲
2.CreateParams
自定义控件内添加:
/// <summary>
/// 封装创建控件时所需的信息
/// </summary>
protected override CreateParams CreateParams
{
get
{
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
调用的窗体里添加:
/// <summary>
/// 封装创建控件时所需的信息
/// </summary>
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
第二种操作简单,作用也比较明显