100分问个ProgressBar显示百分比进度条 本帖最后由 tiandiyuzhou2 于 2011-11-08 11:48:26 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把Thread.Sleep(1)改成Thread.CurrentThread.Join(1);然后for循环执行后,值设置percentProgressBar1.Value =100;或者for循环改为for(int i=1;i<=5000;i++) 可以这样,在进度条上放一个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); } 还有,楼主提供的方法其实也是可行的,但楼主在按钮事件加了Thread.Sleep,这会使用窗口主线程停止,不要加这种代码,你可以用Timer 有绘画第一个进度条就是用重绘的,第二个是放label上去的。第一个都还没到100就停止不绘画了,第二个不会,即使progressbar的value到100,还是会继续计算还有多少没到。 可是背景色主要是为了和进度条的看起来一样。可是进度条背景色是灰色,而进度确实蓝色,而且一格一格的,我能想到的只有设置为透明才能不会让label出现灰色。谢谢,Sleep是为了模拟处理中的进度,实际情况不是只有这么简单,中间的处理会耗费点时间。 i最大就4999,除于5000,怎么可能100%呢:)for(int i=0; i <= 5000; i++){ ... 这暗示了WM_PAINT没有得到调用(见注解)。可以在for循环后加:Application.DoEvents();percentProgressBar1.Refresh();注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Windows系统下就是放一个WM_PAINT消息。但是WM_PAINT是低优先级的消息,而且消息队列里最多只会有一个,多余的WM_PAINT将被系统丢弃。你的例子中不断设置Value,有可能造成某些WM_PAINT丢弃。而窗口复原会激发窗口重新绘制,使得100%被绘制出来。 太感谢你了,注解也写的很好,现在明白了。100都给你。可否提供下这方面的相关资料,之前都是学b/s的,现在对c/s感兴趣,所以最近在学习c/s一些什么消息磊啊什么的都不懂。可否提供下学习资料呢? 还有不理解这个const int WM_PAINT = 15;m.Msg == WM_PAINT15是windows传过来的消息是针对绘画的消息吗?这些值都是windows对消息处理的特定值吗? 你说的这里消息队列中只会有一个,是只会有一个消息,还是只会有一个WM_Paint绘画呢? 这里为什么要用背景色,你看一下代码,是实现Region,这个是把控件进行形状剪栽,代码中的形状是字体,控件被剪裁后就相当于一个字体了,原本label是形状是一个四边形,看起来就是一个有背景色的四边形,但设置Region就是一个有背景色的字体形状了 在完成后加一句,percentProgressBar1.Refresh();就可以了 C#控制摄像头开闭,并拍照 C# winform propertyGridControl细节的处理 问个初中几何问题! 转 IE命令大全 如何得知当前计算机的网络是连通还是断开 请教高手,.NET 快速入门中MSDE如何安装?? 程序集的安全性问题。如何将程序集注册为信任程序集。。。。。 技术求助:C#中如何用word文档来实现打印预览和打印? 解密数据库加密记录,涉及数据库查询嵌套,我这种写法肯定错了,达人帮我看看 用C#做WEB开发时,Timer组件怎么用? 求助datatable 赋值时间问题 求教,怎样释放控件的焦点啊?
然后for循环执行后,值设置percentProgressBar1.Value =100;
或者for循环改为for(int i=1;i<=5000;i++)
加入以下代码就可以了,记得要引用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);
}
第二个是放label上去的。
第一个都还没到100就停止不绘画了,第二个不会,即使progressbar的value到100,还是会继续计算还有多少没到。
{
...
Application.DoEvents();
percentProgressBar1.Refresh();注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Windows系统下就是放一个WM_PAINT消息。但是WM_PAINT是低优先级的消息,而且消息队列里最多只会有一个,多余的WM_PAINT将被系统丢弃。你的例子中不断设置Value,有可能造成某些WM_PAINT丢弃。而窗口复原会激发窗口重新绘制,使得100%被绘制出来。
可否提供下这方面的相关资料,之前都是学b/s的,现在对c/s感兴趣,所以最近在学习c/s
一些什么消息磊啊什么的都不懂。
可否提供下学习资料呢?
const int WM_PAINT = 15;
m.Msg == WM_PAINT
15是windows传过来的消息是针对绘画的消息吗?
这些值都是windows对消息处理的特定值吗?