在工具栏进度条中添加文本

6

我正在尝试将一些文本添加到工具栏进度条中,但迄今为止我还没有成功,这里是我在这里找到的代码:

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方法。因此,我想知道是否有人能够成功地向工具栏进度条添加文本。
更新:
好的,看起来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)));
    }
}

这个问题也发布在http://codereview.stackexchange.com/q/5273/7573上。 - Mark Kram
2个回答

6

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

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

如果您想获得更好的图形效果,那么您还应该为绘图上下文使用SmoothingMode:

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)));
    }
}

0

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

下面是 updateProgressBars() 函数,它通过一个定时器调用。

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

FillDiskRatio() 函数更新进度条的比率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接