客户进度条未正确填写

时间:2015-04-09 07:15:06

标签: c#

我为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();

        }
    }

2 个答案:

答案 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,使用位图不是解决方案。