c# - ".fillrectangle "没有完全填充矩形

本文关键字:quot 填充矩形 fillrectangle | 更新日期: 2023-09-27 18:06:46

我使用下面的代码只是为了测试我将来如何使用自定义进度条——它实际上根本不是一个进度条,而是一个图片框,代码在其上绘制一个矩形,然后根据计时器填充。

问题是,在盒子被填满之前,我已经达到了100%。我已经摸索了一下,但没能找到问题所在。我做错了什么?请看下面的代码,和imgur截图的行为在我的系统。

谢谢。

    public partial class frmLoading : Form
{
    System.Windows.Forms.Timer tLoading = new System.Windows.Forms.Timer();
    Double pbLoadingUnit;
    int pbLoadingWIDTH, pbLoadingHEIGHT, pbLoadingComplete;
    Bitmap bmpLoading;
    Graphics gLoading;
    private void frmLoading_Load(object sender, EventArgs e)
    {
        pbLoadingWIDTH = pictureLoading.Width;
        pbLoadingHEIGHT = pictureLoading.Height;
        pbLoadingUnit = pbLoadingWIDTH / 100;
        pbLoadingComplete = 0;
        bmpLoading = new Bitmap(pbLoadingWIDTH, pbLoadingHEIGHT);
        tLoading.Interval = 32;
        tLoading.Tick += new EventHandler(this.tLoading_Tick);
        tLoading.Start();
    }
    private void tLoading_Tick(object sender, EventArgs e)
    {
        gLoading = Graphics.FromImage(bmpLoading);
        gLoading.Clear(Color.DarkSlateGray);
        gLoading.FillRectangle(Brushes.DodgerBlue, new Rectangle(0, 0, (int)(pbLoadingComplete * pbLoadingUnit), pbLoadingHEIGHT));
        gLoading.DrawString(pbLoadingComplete + "%", new Font("Segoe UI Semibold", pbLoadingHEIGHT / 2), Brushes.White, new PointF(pbLoadingWIDTH / 2 - pbLoadingHEIGHT, pbLoadingHEIGHT / 10));
        pictureLoading.Image = bmpLoading;
        pbLoadingComplete++;
        if (pbLoadingComplete > 100)
        {
            gLoading.Dispose();
            tLoading.Stop();
        }
    }

c# - ".fillrectangle "没有完全填充矩形

你应该改变这个

pbLoadingUnit = pbLoadingWIDTH / 100;

pbLoadingUnit = Convert.ToDouble(pbLoadingWIDTH) / 100;

我假设你的图片宽度不是100的倍数。在旧代码中,pbLoadingUnit将被生成为整数,因为您将整数除以整数。

你也可以这样用:

double div = 100;
pbLoadingUnit = pbLoadingWIDTH / div;

pbLoadingUnit = pbLoadingWIDTH / Convert.ToDouble(100);

关键是,你应该得到pbLoadingUnitdouble值。

有关数值转换的更多信息,您可以查看此链接dotnetperls.com/numeric-casts

尝试在frmLoadingOnResize()事件中放置以下行:

pbLoadingWIDTH = pictureLoading.Width;
pbLoadingHEIGHT = pictureLoading.Height;
pbLoadingUnit = pbLoadingWIDTH / 100; 

有可能你在Load()期间获得pictureLoading的初始大小…而不是实际的width,当它出现并显示在您的表单。

也让tloading.Start()发生,当你已经得到适当的pictureLoading对象的size

你必须将这个变量添加到pbmodal;然后计算单元

的MOD

on form load add

当完成为100%时添加模态。

除法之差

' if (pbLoadingComplete> 100)

{gLoading.FillRectangle(画笔。DodgerBlue, new Rectangle(0,0, (int)(pbLoadingComplete * pbLoadingUnit) + pbmodal, pbLoadingHEIGHT));许多。DrawString(pbLoadingComplete-1 + "%"), new Font("Segoe UI半粗体",pbLoadingHEIGHT/2),画笔。白色,new PointF(pbLoadingWIDTH/2 - pbLoadingHEIGHT, pbLoadingHEIGHT/10));pictureLoading。Image = bmpLoading;} '