代码运行平台:.net2.0 c# winform问题描述:
我有一个窗体,设置了BackgroundImage属性,窗体上有几个Label,所有Label的BackColor都设置为Transparent。启动窗体,发现,每个Label在显示之前都会先闪一下,然后才变成透明。查了一些资料,感觉应该是由于控件在绘制过程中,先擦除背景,然后再绘制控件本身。因此,我用以下方法尝试阻止Windows控件擦除自己的背景:采用自定义一个Label的方法, public class MyLabel : Label
{
public MyLabel()
{
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
UpdateStyles();
} protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) //0x0014表示擦除背景的Windows消息
{
m.Msg = 0x0000;
}
base.WndProc(ref m);
}
} 奇怪的是,这样做没有任何效果,还是照样闪。后来发现,其实构造函数中的SetStyle这几句是没什么作用的,因为按照MSDN文档中描述这几句起作用的前提是控件的IsHandleCreated属性必须为True,而当控件正在被实例化时,IsHandleCreated这个属性是False的。另外为什么我拦截了背景擦除消息还是不行,感觉控件还是会擦除自己的背景,不知道大家有没有遇到过这样的问题,都是怎么处理的?谢谢。
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}不知大家有没有什么好的方法,可以比较好的消除闪烁。如果实在不行,那我就决定直接在窗体上绘制文本或图象了,这样虽然麻烦些,但效果是最好的。
CPU: P4 1.6G
内存:512M