c # .Net Progress Bar Issue - PullRequest
       1

c # .Net Progress Bar Issue

1 голос
/ 19 ноября 2011

Я читаю данные из файла и хотел бы добавить индикатор выполнения к этой операции.Я нашел следующий код в stackoverflow - этот код принадлежит Уильяму Дэниелу, 20 сентября, сообщению stackoverflow под названием «Как изменить цвет индикатора выполнения в C # .Net 3.5»

class CustomProgressBar : ProgressBar
{
    public CustomProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // None... Helps control the flicker.
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        const int inset = 2;
        using (Image offscreenImage = new Bitmap(this.Width, this.Height))
        {
            using (Graphics offscreen = Graphics.FromImage(offscreenImage))
            {
                Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                if (ProgressBarRenderer.IsSupported)
                    ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                rect.Inflate(new Size(-inset, -inset));  // Deflate inner rectangle
                rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));
                if (rect.Width == 0) rect.Width = 1;
                LinearGradientBrush brush = new LinearGradientBrush(rect,
                      this.BackColor, this.ForeColor, LinearGradientMode.Vertical);
                offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);

                e.Graphics.DrawImage(offscreenImage, 0, 0);
                offscreenImage.Dispose();
            }
        }
    }
}

Код работает нормальноза исключением следующего:

  1. Градиент, кажется, не распространяется на всю ширину полосы.Он есть, но гораздо сильнее концентрируется у основания бара и очень быстро истощается, когда мы добираемся до вершины бара.Любые предложения относительно того, как я могу это исправить?

  2. Если я помещу индикатор выполнения в форму и открою окно Internet Explorer над частью формы с индикатором выполнения на нем,часть текста из интернет-окна перетекает на индикатор выполнения в форме.Я понятия не имею, почему и как это исправить.

Кроме того, как можно оценить продолжительность операции, которую вы хотите показать через индикатор выполнения?

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Что касается первой части вашего вопроса - попробуйте использовать следующий конструктор для вашей кисти:

new LinearGradientBrush(new Point(0, 0), new Point(0, Height - inset * 2), BackColor, ForeColor);

Ваша текущая кисть имеет верхнюю контрольную точку на Y=inset - поэтому области от Y=0 до Y=inset все окрашены в сплошной цвет.

1 голос
/ 19 ноября 2011

попробуйте это, вам не нужно на каждой краске создавать изображение ...

 class CustomProgressBar : ProgressBar
 {
  public CustomProgressBar()
  {
   this.SetStyle(ControlStyles.UserPaint|ControlStyles.OptimizedDoubleBuffer|ControlStyles.DoubleBuffer, true);
   this.UpdateStyles();
  }

  protected override void OnPaint(PaintEventArgs e)
  {
   const int inset = 2;
   Rectangle rect = this.ClientRectangle;

   var offscreen = e.Graphics;
   if (ProgressBarRenderer.IsSupported){
    ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);
   }

   rect.Inflate(new Size(-inset, -inset));  // Deflate inner rectangle
   rect.Width = Convert.ToInt32(Math.Round((rect.Width * ((double)this.Value / this.Maximum))));
   if (rect.Width == 0) rect.Width = 1;
   LinearGradientBrush brush = new LinearGradientBrush(rect,this.BackColor, this.ForeColor, LinearGradientMode.Vertical);
   offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);
   offscreen.DrawString(Value.ToString(), this.Font,Brushes.Black,rect);
  }
 }

использовать

const int inset = 1;

на ваш другой вопрос

1 голос
/ 19 ноября 2011

Вы вообще не рисуете в незаполненной части вашего индикатора выполнения.Попробуйте позвонить FillRectangle для области от rect.Right до this.Width с цветом фона.Это должно предотвратить кровотечение от перекрывающихся окон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...