请大家试下:建个新的C#程序,然后拖入100个Label控件,然后运行,会发现窗体出来后,Label控件会从一边刷着显示出来,估计有差不多1秒的时间,没有显示的地方可以看到事透明的。VC.NET建立托管程序也是如此。不仅仅是显示的时候,最小化后,然后再还原,和打开的效果一个样子,刷屏。与集成显卡无关,再独立显卡依然一样。然而使用DELPHI或VC建立的MFC程序就不会出现这种情况。这个问题事托管带来的弊病吗?那么在托管程序中可以解决这个问题吗?如何解决?请高手来指点下。 以下是位网友的答复:
出现的情况是因为:默认是一边创建一边显示,当控件多了时,性能会下降;这时最好等创建完后一起显示,要额外设置一个属性,以开启这种方式,这样和用DELPHI或VC建立的MFC程序在使用感觉上是一样的.
准确的说,应该是在绘制的同时又在显示,所以最小化然后再还原,windows会重新绘制显示,因为我很少在winform下写程序,一时也提供不出这方面的解决方法。但确实有这种设置,一般在好点的书(教程)里会讲到这个的,特别是使用GDI+创建UI,这种设置是基本动作。 请大家帮我找找解决方法。

解决方案 »

  1.   

    我机器是P4 3.0 双核 1G内存,vs2005。速度还是很快,没有1秒多呵呵托管程序本来就是慢。想想java刚出来的时候也不是骂声一片?用虚拟机的速度是没法和原生代码比的
      

  2.   

    你直接drawString算了,100个label多麻烦
      

  3.   

    在windows官方教程(IssueVision)中,会用到开启双缓存,不知道能不能解决这个问题。代码如下:
    SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
      

  4.   

    找到一个方法。
    在做耗时的操作时,为防止白屏, 先 SuspendLayout(),停止FORM刷新, 操作结束后 ResumeLayout() 恢复。
    试了下,不行,可能是我使用的方法错了,但根据MSDN解释应该是可以解决这个问题,请用过的说下,在窗体控件加载时,如何使用这个方法。
      

  5.   

    当调整控件的多个属性时,将先后使用 SuspendLayout 和 ResumeLayout 方法取消多个 Layout 事件。例如,通常先调用 SuspendLayout 方法,然后设置控件的 Size、Location、Anchor 或 Dock 属性,最后调用 ResumeLayout 方法以使更改生效。
      

  6.   

    100个拉lable 还不如自己定义一个新控件。
      

  7.   

    SuspendLayout 和 ResumeLayout 能使速度稍快一些
      

  8.   

    to: jgjzj谢谢,明白了很多。20分少了,不好意思