本帖最后由 tiandiyuzhou2 于 2011-11-08 11:48:26 编辑

解决方案 »

  1.   

    把Thread.Sleep(1)改成Thread.CurrentThread.Join(1);
    然后for循环执行后,值设置percentProgressBar1.Value =100;
    或者for循环改为for(int i=1;i<=5000;i++) 
      

  2.   

    可以这样,在进度条上放一个Label,AutoSize设为false,文字清空,调整大小为合适,背景色设置为你要文字的颜色
    加入以下代码就可以了,记得要引用using System.Drawing.Drawing2D;private void button3_Click(object sender, EventArgs e)
            {
                RegionControl(l_pshow, "100%");
            }        private void RegionControl(Control control, string txt)
            {
                GraphicsPath gp = new GraphicsPath();
                gp.AddString(txt, new FontFamily("宋体"), (int)FontStyle.Bold, 16, control.ClientRectangle, new StringFormat(StringFormatFlags.NoWrap));
                control.Region = new Region(gp);
            }
      

  3.   

    还有,楼主提供的方法其实也是可行的,但楼主在按钮事件加了Thread.Sleep,这会使用窗口主线程停止,不要加这种代码,你可以用Timer
      

  4.   

    有绘画第一个进度条就是用重绘的,
    第二个是放label上去的。
    第一个都还没到100就停止不绘画了,第二个不会,即使progressbar的value到100,还是会继续计算还有多少没到。
      

  5.   

    可是背景色主要是为了和进度条的看起来一样。可是进度条背景色是灰色,而进度确实蓝色,而且一格一格的,我能想到的只有设置为透明才能不会让label出现灰色。谢谢,Sleep是为了模拟处理中的进度,实际情况不是只有这么简单,中间的处理会耗费点时间。
      

  6.   

    i最大就4999,除于5000,怎么可能100%呢:)for(int i=0; i <= 5000; i++)
    {
       ...
      

  7.   

    这暗示了WM_PAINT没有得到调用(见注解)。可以在for循环后加:
    Application.DoEvents();
    percentProgressBar1.Refresh();注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Windows系统下就是放一个WM_PAINT消息。但是WM_PAINT是低优先级的消息,而且消息队列里最多只会有一个,多余的WM_PAINT将被系统丢弃。你的例子中不断设置Value,有可能造成某些WM_PAINT丢弃。而窗口复原会激发窗口重新绘制,使得100%被绘制出来。
      

  8.   

    太感谢你了,注解也写的很好,现在明白了。100都给你。
    可否提供下这方面的相关资料,之前都是学b/s的,现在对c/s感兴趣,所以最近在学习c/s
    一些什么消息磊啊什么的都不懂。
    可否提供下学习资料呢?
      

  9.   

    还有不理解这个
    const int WM_PAINT = 15;
    m.Msg == WM_PAINT
    15是windows传过来的消息是针对绘画的消息吗?
    这些值都是windows对消息处理的特定值吗?
      

  10.   

    你说的这里消息队列中只会有一个,是只会有一个消息,还是只会有一个WM_Paint绘画呢?
      

  11.   

    这里为什么要用背景色,你看一下代码,是实现Region,这个是把控件进行形状剪栽,代码中的形状是字体,控件被剪裁后就相当于一个字体了,原本label是形状是一个四边形,看起来就是一个有背景色的四边形,但设置Region就是一个有背景色的字体形状了
      

  12.   

    在完成后加一句,percentProgressBar1.Refresh();就可以了