如图,在项目中,给panel上面加了一个自定义控件,如下图红框标记的位置。但是在窗体加载时,每次自定义控件都会先变成透明,卡顿一下后才会显示出来
设计器里的效果:
卡顿后的效果:
解决办法:
在使用自定义控件的窗体代码中重写下面的方法:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
在自定义控件的窗体代码中重写下面的方法:
protected override CreateParams CreateParams
{
get
{
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
2020-9-30补充:上述方法可能带来其他问题:
1 如果使用此代码了,且部分界面不能显示,就是此代码造成的
a 我在一个界面上用了3个panel,并且每个panel显示编码器的图像,界面切换时发现只有三个panel图像,其他都不见了,我把这个代码去掉后就显示正常了,具体什么原因就不知道了。
b 有一次我给form添加了个背景图片,切换了几次背景不见了,去掉代码就好了。
多做单元测试,将功能在demo里测试,demo里不需要加什么双缓冲等等,如果demo里有问题,那么就是功能问题了。
2016-8-18 添加, 下面也可以解决双缓冲,暂时没发现什么问题,但是需要单独对每个控件进行设置缓冲
-
public static void SetDouble(Control cc)
-
{
-
cc.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance |
-
System.Reflection.BindingFlags.NonPublic).SetValue(cc, true, null);
-
}
使用方法:
-
SetDouble(this);
-
SetDouble(label1);
也可以试一下这个代码
-
protected override void WndProc(ref Message m)
-
{
-
if (m.Msg == 0x0014) // 禁掉清除背景消息
-
return;
-
base.WndProc(ref m);
-
}