Как мне вывести процент на progressBar1?

#c# #.net #winforms

#c# #.net #winforms

Вопрос:

 private void NewsUpdate()
        {
            counter  = 1;
            progressBar1.Value = counter;
            int percent = progressBar1.Value;
            progressBar1.CreateGraphics().DrawString(
                percent.ToString()   "%", new Font("Arial", (float)8.25, FontStyle.Regular),
                Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
            //progressBar1.Refresh();
            label9.Text = counter.ToString();
            label9.Visible = true;
            if (counter == 10)
            {
                Extractions();
                counter = 0;
            }
        }
  

Таким образом, я вижу проценты в середине progressBar1, но они мигают.
Я пытался добавить progressBar1.Refresh(); до и после рисования пытался аннулировать progressBar1, но ничего не помогает, он мигает.

Этот метод NewsUpdate я вызываю его через событие таймера, для которого установлен интервал 1000 мс

Как я могу сделать его плавным, не мигая?

Редактировать

Это то, что я сделал, я добавил событие переопределения OnPaint:

 protected override void OnPaint(PaintEventArgs e)
        {
            int percent = progressBar1.Value = counter;
            base.OnPaint(e);

            e.Graphics.DrawString(percent.ToString()   "%",
                SystemFonts.DefaultFont,
                Brushes.Black,
                new PointF(progressBar1.Width / 2 - (e.Graphics.MeasureString(percent.ToString()   "%",
                    SystemFonts.DefaultFont).Width / 2.0F),
                progressBar1.Height / 2 - (e.Graphics.MeasureString(percent.ToString()   "%",
                    SystemFonts.DefaultFont).Height / 2.0F)));

        }
  

В методе, который я обновляю в таймере, я сделал недействительным:

 private void NewsUpdate()
        {
            counter  = 1;
            this.Invalidate();
  

Проблема сейчас в том, что я вижу проценты в верхней части form1. Как я могу переместить процент, который будет отображаться на ProgressBar в середине?

ProgressBar

Редактировать

Я попробовал это сейчас:

 protected override void OnPaint(PaintEventArgs e)
        {
            int percent = progressBar1.Value = counter;
            base.OnPaint(e);
            Graphics gr = e.Graphics;
            using (gr = progressBar1.CreateGraphics())
            {
                gr.DrawString(percent.ToString()   "%",
                    SystemFonts.DefaultFont,
                    Brushes.Black,
                    new PointF(progressBar1.Width / 2 - (gr.MeasureString(percent.ToString()   "%",
                        SystemFonts.DefaultFont).Width / 2.0F),
                    progressBar1.Height / 2 - (gr.MeasureString(percent.ToString()   "%",
                        SystemFonts.DefaultFont).Height / 2.0F)));
            }
        }
  

Теперь он находится на панели прогресса, но снова мигает. Проценты мигают.

Комментарии:

1. Поместите элемент управления WPF TextBlock (вместо Label) с завершением в процентах вне элемента управления ProgressBar. Rgds,

2. @AlexBell: Он не использует WPF.

3. Вам нужно обработать и отрисовать Paint событие.

4. Является ли это отображением progressbar?

5. Сара нет. Я создал руководство OnPaint в form1, только что добавил метод с именем OnPain. У ProgressBar нет каких-либо событий paint или onpain. Как я могу создать событие progressBar1 OnPaint ?

Ответ №1:

Если вы установили максимальное значение индикатора выполнения равным 100, вам не нужно вычислять процент от значения progressbar.

 private void progressbar1_Paint(object sender, PaintEventArgs e)
{
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;
    Font font = new Font("Arial", 8.25f, FontStyle.Bold, GraphicsUnit.Point);
    RectangleF rf = new RectangleF(0,0,progressbar1.Width, progressbar1.Height);
    e.Graphics.DrawString(progressbar1.Value.ToString("# %"), font, Brushes.Black,rf, sf);            
}
  

и место progressbar1.Invalidate() , где вы обновляете progressbar1.Value

 progressbar1.Value  = 1;
progressbar1.Invalidate();
  

Комментарии:

1. У ProgressBar dosent есть событие рисования.