Добавление текста в индикатор выполнения полосы инструментов - PullRequest
6 голосов
/ 10 октября 2011

Я пытаюсь добавить какой-либо текст в индикатор выполнения полосы инструментов , но до сих пор у меня не получилось, вот код, который я нашел ЗДЕСЬ :

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.Поэтому мне было интересно, смог ли кто-нибудь успешно добавить текст в индикатор выполнения полосы инструментов.

UPDATE

Хорошо, похоже, что 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)));
    }
}

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

Вы столкнулись с очень распространенной проблемой, связанной с 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 голосов
/ 26 декабря 2016

Мне нужно использовать MethodInvoker для решения проблемы при рисовании обновленного индикатора выполнения.

Вот функция updateProgressBars (), которая вызывается с использованием таймера.

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

FillDiskRatio () обновляет соотношение индикатора выполнения.

...