代码运行平台:.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的。另外为什么我拦截了背景擦除消息还是不行,感觉控件还是会擦除自己的背景,不知道大家有没有遇到过这样的问题,都是怎么处理的?谢谢。

解决方案 »

  1.   

    我尝试了另外一种方法,通过重写MyLabel的以下函数,发现会消除闪烁的问题,但是用了这个方法后MyLabel虽然不会闪烁了,但是显示出来时会晃动,效果也不太理想:        protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x20;
                    return cp;
                }
            }不知大家有没有什么好的方法,可以比较好的消除闪烁。如果实在不行,那我就决定直接在窗体上绘制文本或图象了,这样虽然麻烦些,但效果是最好的。
      

  2.   

    ....背景透明的label?为什么在我机器上看不出来会闪
      

  3.   

    那就奇怪了,就一个设置了背景图片的窗体上放两个透明的Label,在窗体从最小化再还原的时候,每次都能看到Label会闪烁一下,然后才正常显示为透明以及Label的文字,这个闪烁应该比较明显的,如果背景是纯颜色,闪烁会不明显一点。难道是我的机器太慢了,我公司的机器应该不会太差了:
    CPU:  P4 1.6G
    内存:512M