我为C#Forms Application创建了一个简单的进度条。它可以正常加载和运行,唯一的例外是它在达到100%时不会完全填满它需要达到115%才能完成。我不知道为什么这样做。任何见解,你都可以成为我的英雄。这是代码:
private void CustomProgressBar()
{
picBoxPB.Visible = true;
width = picBoxPB.Width;
height = picBoxPB.Height;
Unit = width / 100;
complete = 0;
bmp = new Bitmap(width, height);
t.Interval = 30;
t.Tick += new EventHandler(this.t_Tick);
t.Start();
}
private void t_Tick(object sender, EventArgs e)
{
graph = Graphics.FromImage(bmp);
graph.Clear(Color.DarkGoldenrod);
graph.FillRectangle(Brushes.ForestGreen, new Rectangle(0,0,(int)(complete * Unit),height));
graph.DrawString(complete + "%", new Font("Papyrus", height / 3), Brushes.Black, new PointF(width / 2 - height, height / 10));
picBoxPB.Image = bmp;
complete++;
if (complete>100)
{
graph.Dispose();
t.Stop();
}
}
答案 0 :(得分:1)
在没有任何更多信息的情况下,我可以看到,在绘制图形之后,您正在递增整个变量。
一个疯狂的猜测是你将整个移动到方法的顶部,例如
private void t_Tick(object sender, EventArgs e)
{
complete++;
graph = Graphics.FromImage(bmp);
graph.Clear(Color.DarkGoldenrod);
graph.FillRectangle(Brushes.ForestGreen, new Rectangle(0,0,(int)(complete * Unit),height));
graph.DrawString(complete + "%", new Font("Papyrus", height / 3), Brushes.Black, new PointF(width / 2 - height, height / 10));
picBoxPB.Image = bmp;
if (complete>100)
{
graph.Dispose();
t.Stop();
}
}
这个假设不理解Unit
字段(它似乎是Width
字段的百分比(未显示)。
答案 1 :(得分:0)
您将Unit
初始化为width / 100
即可,但您可以在CustomProgressBar()
中进行,而不是在width
使用。
如果您的控件在其他地方使用,则可能会调整其大小。所以Unit
会改变。但是您没有相应地更新Bitmap
(在您的Unit
对象之后)。
哟有两个选择:
Unit
。t_tick
功能中移动Unit
变量,并每次都进行计算。第二个选项会花费更多时间,但代码可读性方式更好。
如果您未在其他地方使用{{1}}变量,请选择第二个选项。
此外,如果您的目标是绘制custom control,您应该了解如何重载Control.OnPaint,使用位图不是解决方案。