1.窗体有背景
2.窗体上所有图片都是Label控件,并且有鼠标移动切换图片事件和点击事件
3.每页控件数目蛮多的,最少8个,多的话有30个左右
试过很多办法,其中如果窗体无背景效果不错,但是窗体一定要有背景。
如果用PictrueBox做背景,效果不错,但是Label图片内容不规则透明的地方直接显示窗体背景色,也就是说直接把背景的PictureBox的颜色给透明了,也不可以。
双缓冲的话我想不到什么好方法可以应用,内部类似
            this.DoubleBuffered = true;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
的设置也都没有效果,API"lockWindowUpdate"也不行。
希望各位大侠帮助了,小弟先谢过。
下面是我的一个测试的代码,没有做任何时间,显示窗体时闪烁的也很厉害。public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }        private void Form1_Load(object sender, EventArgs e)
        {
            this.Width = 1024;
            this.Height = 768;
            this.BackgroundImage = Image.FromFile(@"E:\LinZhi\Image\2006116203724.6780804.jpg");
            Label[] lbl = new Label[220];
            for (int i = 0; i < 220; i++)
            {
                lbl[i] = new Label();
                lbl[i].Image = Image.FromFile(@"E:\LinZhi\Bmp\1172423753636.jpg");
                lbl[i].Left = i % 10 * 110;
                lbl[i].Top = i / 10 * (lbl[i].Height + 10);
                this.Controls.Add(lbl[i]);
            }
        }项目基本已经完工,希望尽量少的改动可以实现无闪烁,谢谢。
QQ:33871551  工作时都在线,希望知道怎么做的可以教下。

解决方案 »

  1.   

    file读一次保存到内存中看看会不会好一点.
      

  2.   

    控件在界面上多了以后会闪的历害,这时设置OptimizedDoubleBuffer是没有作用的!这个闪就是因为控件太多了,每一个控件的绘制都会消耗很多的系统资源,每当程序界面要求绘制的时候系统会依次的对每一个控件进行绘制,因为每一个都占用相当的时间,所以控件多了以后就会出现从头到尾的闪一下.这个应该没有很好的解决方法,除非你把控件减少到一定的程序.OptimizedDoubleBuffer只是对一个控件来说的,设置OptimizedDoubleBuffer后在这个控件上的绘制会是得到很好的效果,可是控件一多就不是这个原因了.知道这个原因后你所要做的就是尽量的少向界面上放置控件.
      

  3.   

    见到你的界面上有很多的Label控件,建立你使用Grid控件,比如DataGridView,DataGrid,ListView等控件,这样用一个控件就可以代替好多个控件,占用系统的资源就少的多了.
      

  4.   

    Bitmap bitmap = new Bitmap(Image.FromFile(@"E:\LinZhi\Bmp\1172423753636.jpg"));
                this.Width = 1024;
                this.Height = 768;
                this.BackgroundImage =bitmap;
                Label[] lbl = new Label[220];
                for (int i = 0; i < 220; i++)
                {
                    lbl[i] = new Label();
                    lbl[i].Image = bitmap;
                    lbl[i].Left = i % 10 * 110;
                    lbl[i].Top = i / 10 * (lbl[i].Height + 10);
                    this.Controls.Add(lbl[i]);
                }读到内存中后只是窗体显示的速度快了,但是图片闪烁没有好转。
    每当窗体被其他东西盖住再显示的时候控件闪烁非常严重
      

  5.   

    等吧,现在好多写控件的人水平很差,运行效率太低。下次不要使用第三方的控件,不好的,都写得太差了,耗内存不去说它了,显示还特别慢,我深有体会。等吧,等WPF流行吧,那个还比较好。过渡阶段使用HTML吧,我现在就是WebBrowsor+HTML+JS
      

  6.   

    刚才试验了一下
    访了 25  Label + pic好像没有闪烁啊
      

  7.   

    单独的25个label闪烁效果不大,但是如果label有其他的一些属性就慢了
      

  8.   

    问题还没解决啊~````
    新的进展,我发现闪烁的原因是因为label的背景色为透明引起的,如果不透明的话速度就很快了,可是一定要透明才可以啊,有没有办法?
      

  9.   

    实在不行用GDI+画,比用控件快很多
      

  10.   

    把图片先合在一起,再放到panel里试试
      

  11.   


    把图片先合在一起,再放到panel里试试
    合在一起事件如何执行?和才一起效果到是会很好
    自己写一个控件不就是
    不一定什么都用人家的
    自己写的控件,画图片也一样会有这种想象。最终也没能解决这个问题,我采取了超笨的方法,那就是不设置LABEL背景透明,而截取比较大一点的图替换,这样速度便到达要求了。虽然问题没解决,但是还是谢谢大家了~`
      

  12.   

    最近开始写界面,以及控件方面的东东,我一个界面上要放n多控件,只是有点闪烁。
    做法是,每个控件的构造函数中加入
    SetStyle(ControlStyles.DoubleBuffer, true);
    再不行加
    SetStyle(ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
    SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
    应该就可以了
      

  13.   

    向canghaiyixiaowh  学习一下,我也碰到这样和问题,回去写个东西试试,这个都成世界性的难题了