100分问个ProgressBar显示百分比进度条

tiandiyuzhou2 2011-11-08 11:47:57
原本进读条上我放了个label,可是

label的背景色为灰色,
我设置了BackColor="Transparent",以及parent=ProgressBar
可是还是不行。
后来有个朋友给了这段代码。

public class PercentProgressBar : ProgressBar
{
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
const int WM_PAINT = 15;
if (m.Msg == WM_PAINT && this.Value > 0)
{
using (Graphics g = this.CreateGraphics())
{
string percentage = this.Tag.ToString();
StringFormat sf = new StringFormat();
sf.Alignment = sf.LineAlignment = StringAlignment.Center;
g.DrawString(percentage, SystemFonts.DefaultFont, Brushes.Red, this.ClientRectangle, sf);
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5000; i++)
{
percentProgressBar1.Tag = ((double)i / 5000 * 100).ToString("f2");
percentProgressBar1.Value = Convert.ToInt32((double)i / 5000 * 100);
Thread.Sleep(1);
}
}

可是调用的话还没显示100%,就停止不继续绘画了。

上面两个问题,
1:设置label透明
2:让PercentProgressBar 可以完整的显示到100%;
...全文
1179 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsycool123 2012-02-09
  • 打赏
  • 举报
回复
i<=10000
lsycool123 2012-02-09
  • 打赏
  • 举报
回复
进度条最大设成100
cnwin 2011-11-08
  • 打赏
  • 举报
回复
关注一下
Flashcom 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tiandiyuzhou2 的回复:]

引用 10 楼 gomoku 的回复:
引用楼主 tiandiyuzhou2 的回复:
for (int i = 0; i < 5000; i++)
{
percentProgressBar1.Tag = ((double)i / 5000 * 100).ToString("f2");
...

i最大就4999,除于5000,怎么可能100%呢:)

for(int i=0;……
[/Quote]
在完成后加一句,percentProgressBar1.Refresh();就可以了
Flashcom 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tiandiyuzhou2 的回复:]

引用 5 楼 flashcom 的回复:
可以这样,在进度条上放一个Label,AutoSize设为false,文字清空,调整大小为合适,背景色设置为你要文字的颜色
加入以下代码就可以了,记得要引用using System.Drawing.Drawing2D;

C# code

private void button3_Click(object sender, EventArgs ……
[/Quote]
这里为什么要用背景色,你看一下代码,是实现Region,这个是把控件进行形状剪栽,代码中的形状是字体,控件被剪裁后就相当于一个字体了,原本label是形状是一个四边形,看起来就是一个有背景色的四边形,但设置Region就是一个有背景色的字体形状了
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gomoku 的回复:]
但是WM_PAINT是低优先级的消息,而且消息队列里最多只会有一个,多余的WM_PAINT将被系统丢弃[/Quote]
你说的这里消息队列中只会有一个,是只会有一个消息,还是只会有一个WM_Paint绘画呢?
allen0118 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gomoku 的回复:]
引用 11 楼 tiandiyuzhou2 的回复:
...然后当我把窗口缩下来,然后在缩上来的时候就变为100%了

这暗示了WM_PAINT没有得到调用(见注解)。可以在for循环后加:
Application.DoEvents();
percentProgressBar1.Refresh();

注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Wind……
[/Quote]

++
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
还有不理解这个
const int WM_PAINT = 15;
m.Msg == WM_PAINT
15是windows传过来的消息是针对绘画的消息吗?
这些值都是windows对消息处理的特定值吗?
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gomoku 的回复:]
引用 11 楼 tiandiyuzhou2 的回复:
...然后当我把窗口缩下来,然后在缩上来的时候就变为100%了

这暗示了WM_PAINT没有得到调用(见注解)。可以在for循环后加:
Application.DoEvents();
percentProgressBar1.Refresh();

注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Wind……
[/Quote]太感谢你了,注解也写的很好,现在明白了。100都给你。
可否提供下这方面的相关资料,之前都是学b/s的,现在对c/s感兴趣,所以最近在学习c/s
一些什么消息磊啊什么的都不懂。
可否提供下学习资料呢?
javabegin 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tiandiyuzhou2 的回复:]
引用 1 楼 lmaohuanl 的回复:
直接让它绘到100去不就ok
扯蛋...

引用 2 楼 javabegin 的回复:
把Thread.Sleep(1)改成Thread.CurrentThread.Join(1);
然后for循环执行后,值设置percentProgressBar1.Value =100;
或者for循环改为for(int i=1;i<=5000;i++)……
[/Quote]
你觉得你的方法能到100%吗?麻烦算一下4999/5000*100。
gomoku 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tiandiyuzhou2 的回复:]
...然后当我把窗口缩下来,然后在缩上来的时候就变为100%了
[/Quote]
这暗示了WM_PAINT没有得到调用(见注解)。可以在for循环后加:
Application.DoEvents();
percentProgressBar1.Refresh();

注:设定Value时,ProgressBar内部将要求本身窗口重新绘制,在Windows系统下就是放一个WM_PAINT消息。但是WM_PAINT是低优先级的消息,而且消息队列里最多只会有一个,多余的WM_PAINT将被系统丢弃。你的例子中不断设置Value,有可能造成某些WM_PAINT丢弃。而窗口复原会激发窗口重新绘制,使得100%被绘制出来。
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gomoku 的回复:]
引用楼主 tiandiyuzhou2 的回复:
for (int i = 0; i < 5000; i++)
{
percentProgressBar1.Tag = ((double)i / 5000 * 100).ToString("f2");
...

i最大就4999,除于5000,怎么可能100%呢:)

for(int i=0; i <= 5000; i++)
{
……
[/Quote]谢谢,纠正过来了,不过我现在发现。
当处理完的时候,这时候是

94.6%
然后当我把窗口缩下来,然后在缩上来的时候就变为100%了。这么奇怪。
gomoku 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 tiandiyuzhou2 的回复:]
for (int i = 0; i < 5000; i++)
{
percentProgressBar1.Tag = ((double)i / 5000 * 100).ToString("f2");
...
[/Quote]
i最大就4999,除于5000,怎么可能100%呢:)

for(int i=0; i <= 5000; i++)
{
...
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flashcom 的回复:]
可以这样,在进度条上放一个Label,AutoSize设为false,文字清空,调整大小为合适,背景色设置为你要文字的颜色
加入以下代码就可以了,记得要引用using System.Drawing.Drawing2D;

C# code

private void button3_Click(object sender, EventArgs e)
{
……
[/Quote]可是背景色主要是为了和进度条的看起来一样。可是进度条背景色是灰色,而进度确实蓝色,而且一格一格的,我能想到的只有设置为透明才能不会让label出现灰色。[Quote=引用 6 楼 flashcom 的回复:]
还有,楼主提供的方法其实也是可行的,但楼主在按钮事件加了Thread.Sleep,这会使用窗口主线程停止,不要加这种代码,你可以用Timer
[/Quote]谢谢,Sleep是为了模拟处理中的进度,实际情况不是只有这么简单,中间的处理会耗费点时间。
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lmaohuanl 的回复:]
直接让它绘到100去不就ok
[/Quote]扯蛋...[Quote=引用 2 楼 javabegin 的回复:]
把Thread.Sleep(1)改成Thread.CurrentThread.Join(1);
然后for循环执行后,值设置percentProgressBar1.Value =100;
或者for循环改为for(int i=1;i<=5000;i++)
[/Quote]设置为100,那还要进度条干嘛啊。和0木有关系的。
tiandiyuzhou2 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 youzelin 的回复:]
引用楼主 tiandiyuzhou2 的回复:
原本进读条上我放了个label,可是

label的背景色为灰色,
我设置了BackColor="Transparent",以及parent=ProgressBar
可是还是不行。
后来有个朋友给了这段代码。
C# code

public class PercentProgressBar : ProgressBar
{
pro……
[/Quote]
有绘画

第一个进度条就是用重绘的,
第二个是放label上去的。
第一个都还没到100就停止不绘画了,第二个不会,即使progressbar的value到100,还是会继续计算还有多少没到。
Flashcom 2011-11-08
  • 打赏
  • 举报
回复
还有,楼主提供的方法其实也是可行的,但楼主在按钮事件加了Thread.Sleep,这会使用窗口主线程停止,不要加这种代码,你可以用Timer
Flashcom 2011-11-08
  • 打赏
  • 举报
回复
可以这样,在进度条上放一个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);
}
山东蓝鸟贵薪 2011-11-08
  • 打赏
  • 举报
回复
还是根据 文件操作的情况再将“进度”+1
即可
youzelin 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 tiandiyuzhou2 的回复:]
原本进读条上我放了个label,可是

label的背景色为灰色,
我设置了BackColor="Transparent",以及parent=ProgressBar
可是还是不行。
后来有个朋友给了这段代码。
C# code

public class PercentProgressBar : ProgressBar
{
protected overr……
[/Quote]

"可是调用的话还没显示100%,就停止不继续绘画了" ---- 是到百分之几的时候不绘画的?还是压根没有绘画?
加载更多回复(2)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧