向工具条进度条添加文本

本文关键字:添加 文本 工具 | 更新日期: 2023-09-27 18:10:53

我正在尝试添加一些文本到工具条进度条,但我到目前为止还没有成功,这里是我发现的一些代码:

private void pbPrecentage(ToolStripProgressBar pb)
{
    ProgressBar p = new ProgressBar();
    int percent = (int)(((double)(pb.Value - pb.Minimum) /
    (double)(pb.Maximum - pb.Minimum)) * 100);
    using (Graphics gr = pb.CreateGraphics())
    {
        gr.DrawString(percent.ToString() + "%",
            SystemFonts.DefaultFont,
            Brushes.Black,
            new PointF(pb.Width / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Width / 2.0F),
            pb.Height / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Height / 2.0F)));
    }
}

问题是工具条进度条没有CreateGraphics方法。所以我想知道是否有人能够成功地将文本添加到工具条进度条。

更新

Ok,似乎ToolStripProgressBar有一个进度条属性,它反过来又有CreateGraphics方法,但现在的问题是文本值是闪烁和闪烁,我该如何去修复这个?下面是修改后的代码:

private void pbPrecentage(ToolStripProgressBar pb)
{
    int percent = (int)(((double)(pb.Value - pb.Minimum) /
    (double)(pb.Maximum - pb.Minimum)) * 100);
    using (Graphics gr = pb.ProgressBar.CreateGraphics())
    {
        gr.DrawString(percent.ToString() + "%",
            SystemFonts.DefaultFont,
            Brushes.Black,
            new PointF(pb.Width / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Width / 2.0F),
            pb.Height / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Height / 2.0F)));
    }
}

向工具条进度条添加文本

你正在遇到一个关于Windows窗体的非常常见的问题,它是基于GDI+的。用于绘制控件(以及用户绘制上下文,如图形)的双缓冲的标准设置是关闭的。因此,只需在表单中添加几行代码:

public Form1()
{
//Activate Double Buffering for all kind of drawing within your form
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
}

如果你想获得更好的图像,那么你也应该为你的绘图上下文使用平滑模式:

private void pbPrecentage(ToolStripProgressBar pb)
{
    int percent = (int)(((double)(pb.Value - pb.Minimum) /
    (double)(pb.Maximum - pb.Minimum)) * 100);
    using (Graphics gr = pb.ProgressBar.CreateGraphics())
    {
        //Switch to Antialiased drawing for better (smoother) graphic results
        gr.SmoothingMode = SmoothingMode.AntiAlias;
        gr.DrawString(percent.ToString() + "%",
            SystemFonts.DefaultFont,
            Brushes.Black,
            new PointF(pb.Width / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Width / 2.0F),
            pb.Height / 2 - (gr.MeasureString(percent.ToString() + "%",
                SystemFonts.DefaultFont).Height / 2.0F)));
    }
}

我需要使用MethodInvoker来解决绘制更新进度条时的问题。

这是updateProgressBars()函数,它是使用计时器调用的。

private void updateProgressBars(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.Invoke(new MethodInvoker(delegate
        {
            FillDiskRatio(false);
        }));
    }

FillDiskRatio()更新进度条的比率