C# - “.FillRectangle”未完全填充矩形
C# - ".FillRectangle" Not Completely Filling Rectangle
我使用以下代码只是为了测试我将来如何使用自定义进度条 - 它实际上根本不是进度条,而是代码绘制矩形的图片框打开,然后根据计时器填满。
问题是,我在盒子填满之前就达到了 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();
}
}
尝试将以下行放入 frmLoading
的 OnResize()
事件中:
pbLoadingWIDTH = pictureLoading.Width;
pbLoadingHEIGHT = pictureLoading.Height;
pbLoadingUnit = pbLoadingWIDTH / 100;
您可能会在 Load()
期间获得 pictureLoading
的初始大小...而不是 width
出现并显示在您的表单中时的实际大小。
当您已经获得合适的 size
的 pictureLoading
对象时,也让 tloading.Start()
发生。
你必须添加这个变量 int pbmodal;
然后计算单位
的MOD
在表单加载时添加
pbmodal = pbLoadingWIDTH % 100;
当完成度为 100% 时添加模态。
除法差异
`if (pbLoadingComplete > 100)
{
gLoading.FillRectangle(Brushes.DodgerBlue, new Rectangle(0, 0, (int)(pbLoadingComplete * pbLoadingUnit) + pbmodal, pbLoadingHEIGHT));
gLoading.DrawString(pbLoadingComplete-1 + "%", new Font("Segoe UI Semibold", pbLoadingHEIGHT / 2), Brushes.White, new PointF(pbLoadingWIDTH / 2 - pbLoadingHEIGHT, pbLoadingHEIGHT / 10));
pictureLoading.Image = bmpLoading;
}`
你应该改变这个
pbLoadingUnit = pbLoadingWIDTH / 100;
至此
pbLoadingUnit = Convert.ToDouble(pbLoadingWIDTH) / 100;
我假设你的图片宽度不是一百的倍数。
使用您的旧代码,您的 pbLoadingUnit 将生成为整数,因为您将整数除以整数。
你也可以用这个:
double div = 100;
pbLoadingUnit = pbLoadingWIDTH / div;
或
pbLoadingUnit = pbLoadingWIDTH / Convert.ToDouble(100);
关键是,你应该得到 pbLoadingUnit
的 double
值。
有关数字转换的更多信息,您可能会看到此 link dotnetperls.com/numeric-casts
我使用以下代码只是为了测试我将来如何使用自定义进度条 - 它实际上根本不是进度条,而是代码绘制矩形的图片框打开,然后根据计时器填满。
问题是,我在盒子填满之前就达到了 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();
}
}
尝试将以下行放入 frmLoading
的 OnResize()
事件中:
pbLoadingWIDTH = pictureLoading.Width;
pbLoadingHEIGHT = pictureLoading.Height;
pbLoadingUnit = pbLoadingWIDTH / 100;
您可能会在 Load()
期间获得 pictureLoading
的初始大小...而不是 width
出现并显示在您的表单中时的实际大小。
当您已经获得合适的 size
的 pictureLoading
对象时,也让 tloading.Start()
发生。
你必须添加这个变量 int pbmodal; 然后计算单位
的MOD在表单加载时添加
pbmodal = pbLoadingWIDTH % 100;
当完成度为 100% 时添加模态。
除法差异
`if (pbLoadingComplete > 100)
{ gLoading.FillRectangle(Brushes.DodgerBlue, new Rectangle(0, 0, (int)(pbLoadingComplete * pbLoadingUnit) + pbmodal, pbLoadingHEIGHT)); gLoading.DrawString(pbLoadingComplete-1 + "%", new Font("Segoe UI Semibold", pbLoadingHEIGHT / 2), Brushes.White, new PointF(pbLoadingWIDTH / 2 - pbLoadingHEIGHT, pbLoadingHEIGHT / 10)); pictureLoading.Image = bmpLoading; }`
你应该改变这个
pbLoadingUnit = pbLoadingWIDTH / 100;
至此
pbLoadingUnit = Convert.ToDouble(pbLoadingWIDTH) / 100;
我假设你的图片宽度不是一百的倍数。 使用您的旧代码,您的 pbLoadingUnit 将生成为整数,因为您将整数除以整数。
你也可以用这个:
double div = 100;
pbLoadingUnit = pbLoadingWIDTH / div;
或
pbLoadingUnit = pbLoadingWIDTH / Convert.ToDouble(100);
关键是,你应该得到 pbLoadingUnit
的 double
值。
有关数字转换的更多信息,您可能会看到此 link dotnetperls.com/numeric-casts