问题背景:

  由于该项目是一个触摸屏系统,为了画面美观,几乎每个Form都会有一个比较大的背景图片,而需要我解决问题的这个Form的背景图片
Property:676*511,60KB。
    注:其实Form中还嵌套了一个Panel。
  该Form中共有Label Control 26个,这些Label是用IDE手工添加的,但文字是来自于Hashtable动态添加。
    程序运行后,看到的问题就是这些Label不是一起显示,而是一个一个的显示出来,而显示的顺序取决于你向上一级容器中添加的顺序,比如:

        this.panel1.Controls.Add(this.label1);
        this.panel1.Controls.Add(this.label2);
        this.panel1.Controls.Add(this.label3);
        this.panel1.Controls.Add(this.label4);
        .....................................;


问题出现后:

  问题出现后,先后尝试了几套方案
  方案一:通过修改容器的Visible属性,即:

       
this.panel1.Visible = false;
        //do something
        this.panel1.Visible = true;

  方案二:尝试在以下Property中寻找解决办法,盖茨说,下面的Property专门解决次问题。

       
this.SuspendLayout();
        //do something
        this.ResumeLayout(false);

  注:不过,我曾经尝试过先后去掉这两个property,没有发现有什么不同,也许我还没有完全理解盖茨的话,如有高手了解细节,请赐教。

   
后来有高人说,这是.Net的策略,是Microsoft底层的东西,目的是为了节省内存空间,我们改变不了。他们这样说也不无道理,因为,该系统的两代前身分别是用VB和Java做的,都没有这样的问题。他们说,要想解决此问题,需利用双缓存技术,很简单,就三句话:

  (那三句话我忘了!)

    双缓存技术,没有将问题
解决。

  公司一位高人为了解决来自于Microsoft底层的问题,重写了Paint方法,当然解决了这个问题, 不过这种方法我个人并不提倡,因为Microsoft底层的任何做法和改动都会有他的理由。
  注:我不是Microsoft崇拜者,只是就事论事。
  还有,重写Paint方法后的显示效果,我觉得没有我最终解决后的显示效果更好,也可以说是更快。解决方法见下文……


解决问题:

最后,在几个小时的痛苦摸索中发现了让Form中的Controls一起显示的秘诀。
  
试验中,我发现即使在一个Form中同时画上几十个Controls都没有问题,只要不设置Form或是Panel的背景图片,几乎都可以做到一起显示。
  至此,得出一结论:此问题跟背景图片有关。

  然而,背景图片来自于Local,60K的图片几乎可以忽略不计;并且,项目中Form必须要放置背景图片,所以不能在这方面做文章,Pass!

  由于要映出背景图片,所以此Form中的几十个label的背景颜色都置成透明(Transparent)。
最后发现,问题就出现这些透明的背景颜色上。

   
最终的解决办法就是把这些Labels都赋上背景颜色,为了达到效果,当然取的颜色和Form的背景图片相一致,在这里我取了白色,只要不把这些label的背景颜色置成透明(transparent),即可以达到一起显示的效果,就这么简单,问题解决后我是又高兴又生气,毕竟花了近一个下午的时间……


    最后,由衷感谢在问题提出后,及时给与我帮助的网友:
    http://community.csdn.net/Expert/topic/4351/4351696.xml?temp=.2896234

posted on 2005-10-27 20:35  10cn.net  阅读(519)  评论(0编辑  收藏  举报