Поделиться через


Создание плавной панели выполнения с помощью Visual C#

В этой статье содержатся сведения о создании пользовательского элемента UserControl для создания плавного прокручиваемого элемента управления ProgressBar.

Исходная версия продукта: Visual C#
Исходный номер базы знаний: 323116

Итоги

В этой статье показано, как создать простой, настраиваемый UserControl для создания плавного прокручиваемого элемента управления ProgressBar.

В более ранних версиях элемента управления ProgressBar, например версия, предоставляемая элементом ActiveX Для общих элементов управления Microsoft Windows, можно просмотреть ход выполнения в двух разных представлениях. Для управления этими представлениями используйте свойство Прокрутки, которое включает стандартные и гладкие параметры. Гладкая прокрутка создает твердый блок цвета, который представляет ход выполнения, и стандартное прокрутка отображается сегментировано и состоит из ряда небольших блоков или прямоугольников.

Элемент управления ProgressBar, включенный в Microsoft Visual C#, поддерживает только стандартный параметр.

В примере кода в этой статье показано, как создать элемент управления, поддерживающий следующие свойства:

  • Минимальное: это свойство получает или задает меньшее значение для диапазона допустимых значений для хода выполнения. Значение по умолчанию этого свойства равно нулю (0); Это свойство нельзя задать для отрицательного значения.
  • Максимальное значение: это свойство получает или задает верхнее значение диапазона допустимых значений для хода выполнения. Значение по умолчанию этого свойства равно 100.
  • Значение: это свойство получает или задает текущий уровень хода выполнения. Значение должно находиться в диапазоне, который определяют минимальные и максимальные свойства.
  • ProgressBarColor: это свойство получает или задает цвет индикатора выполнения.

Создание пользовательского элемента управления ProgressBar

  1. Выполните следующие действия, чтобы создать проект библиотеки элементов управления Windows в Visual C#:

    1. Запустите Microsoft Visual Studio.

    2. В меню Файл выберите пункт Создать и затем пункт Проект.

    3. В диалоговом окне "Создать проект" щелкните Visual C# в разделе "Типы проектов" и выберите библиотеку элементов управления Windows Forms в разделе "Шаблоны".

    4. В поле "Имя" введите SmoothProgressBar и нажмите кнопку "ОК".

    5. В обозревателе проектов переименуйте модуль класса по умолчанию из UserControl1.cs в SmoothProgressBar.cs.

    6. В окне свойств объекта UserControl измените свойство Name с UserControl1 на SmoothProgressBar.

  2. На этом этапе обычно наследуется от класса этого элемента управления, а затем добавляется дополнительная функциональность для расширения существующего элемента управления. Однако класс ProgressBar запечатан и не может быть унаследован. Поэтому необходимо создать элемент управления с самого начала.

    Добавьте следующий код в файл SmoothProgressBar.cs в класс, производный от UserControl.

    int min = 0;// Minimum value for progress range
    int max = 100;// Maximum value for progress range
    int val = 0;// Current progress
    Color BarColor = Color.Blue;// Color of progress meter
    
    protected override void OnResize(EventArgs e)
    {
        // Invalidate the control to get a repaint.
        this.Invalidate();
    }
    
    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        SolidBrush brush = new SolidBrush(BarColor);
        float percent = (float)(val - min) / (float)(max - min);
        Rectangle rect = this.ClientRectangle;
    
        // Calculate area for drawing the progress.
        rect.Width = (int)((float)rect.Width * percent);
    
        // Draw the progress meter.
        g.FillRectangle(brush, rect);
    
        // Draw a three-dimensional border around the control.
        Draw3DBorder(g);
    
        // Clean up.
        brush.Dispose();
        g.Dispose();
    }
    
    public int Minimum
    {
        get
        {
            return min;
        }
    
        set
        {
            // Prevent a negative value.
            if (value < 0)
            {
                value = 0;
            }
    
            // Make sure that the minimum value is never set higher than the maximum value.
            if (value > max)
            {
                max = value;
            }
    
            min = value;
    
            // Ensure value is still in range
            if (val < min)
            {
                val = min;
            }
    
            // Invalidate the control to get a repaint.
            this.Invalidate();
        }
    }
    
    public int Maximum
    {
        get
        {
            return max;
        }
    
        set
        {
            // Make sure that the maximum value is never set lower than the minimum value.
            if (value < min)
            {
                min = value;
            }
    
            max = value;
    
            // Make sure that value is still in range.
            if (val > max)
            {
                val = max;
            }
    
            // Invalidate the control to get a repaint.
            this.Invalidate();
        }
    }
    
    public int Value
    {
        get
        {
            return val;
        }
    
        set
        {
            int oldValue = val;
    
            // Make sure that the value does not stray outside the valid range.
            if (value < min)
            {
                val = min;
            }
            else if (value > max)
            {
                val = max;
            }
            else
            {
                val = value;
            }
    
            // Invalidate only the changed area.
            float percent;
    
            Rectangle newValueRect = this.ClientRectangle;
            Rectangle oldValueRect = this.ClientRectangle;
    
            // Use a new value to calculate the rectangle for progress.
            percent = (float)(val - min) / (float)(max - min);
            newValueRect.Width = (int)((float)newValueRect.Width * percent);
    
            // Use an old value to calculate the rectangle for progress.
            percent = (float)(oldValue - min) / (float)(max - min);
            oldValueRect.Width = (int)((float)oldValueRect.Width * percent);
    
            Rectangle updateRect = new Rectangle();
    
            // Find only the part of the screen that must be updated.
            if (newValueRect.Width > oldValueRect.Width)
            {
                updateRect.X = oldValueRect.Size.Width;
                updateRect.Width = newValueRect.Width - oldValueRect.Width;
            }
            else
            {
                updateRect.X = newValueRect.Size.Width;
                updateRect.Width = oldValueRect.Width - newValueRect.Width;
            }
    
            updateRect.Height = this.Height;
    
            // Invalidate the intersection region only.
            this.Invalidate(updateRect);
        }
    }
    
    public Color ProgressBarColor
    {
        get
        {
            return BarColor;
        }
    
        set
        {
            BarColor = value;
    
            // Invalidate the control to get a repaint.
            this.Invalidate();
        }
    }
    
    private void Draw3DBorder(Graphics g)
    {
        int PenWidth = (int)Pens.White.Width;
    
        g.DrawLine(Pens.DarkGray,
        new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
        new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));
        g.DrawLine(Pens.DarkGray,
        new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
        new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth));
        g.DrawLine(Pens.White,
        new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth),
        new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
        g.DrawLine(Pens.White,
        new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top),
        new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
    }
    
  3. В меню "Сборка " щелкните "Создать решение ", чтобы скомпилировать проект.

Создание примера клиентского приложения

  1. В меню Файл выберите пункт Создать и затем пункт Проект.

  2. В диалоговом окне "Добавление нового проекта" нажмите кнопку Visual C# в разделе "Типы проектов", щелкните "Приложения Windows Forms" в разделе "Шаблоны" и нажмите кнопку "ОК".

  3. Выполните следующие действия, чтобы добавить два экземпляра элемента управления SmoothProgressBar в форму:

    1. В меню Сервис выберите пункт Выбрать элементы панели элементов.

    2. Перейдите на вкладку "Компоненты платформа .NET Framework".

    3. Нажмите кнопку "Обзор", а затем найдите файл SmoothProgressBar.dll , созданный в разделе "Создание пользовательского элемента управления ProgressBar".

    4. Нажмите кнопку ОК.

      Примечание.

      Элемент управления SmoothProgressBar добавляется на панель элементов.

    5. Перетащите два экземпляра элемента управления SmoothProgressBar из панели элементов в форму проекта приложения Windows по умолчанию.

  4. Перетащите элемент управления Таймера из панели элементов в форму.

  5. Добавьте следующий код в Tick событие элемента управления Таймер:

    if (this.smoothProgressBar1.Value > 0)
    {
        this.smoothProgressBar1.Value--;
        this.smoothProgressBar2.Value++;
    }
    else
    {
        this.timer1.Enabled = false;
    }
    
  6. Перетащите элемент управления Button из панели элементов в форму.

  7. Добавьте следующий код в Click событие элемента управления Button:

    this.smoothProgressBar1.Value = 100;
    this.smoothProgressBar2.Value = 0;
    
    this.timer1.Interval = 1;
    this.timer1.Enabled = true;
    
  8. В меню отладки нажмите кнопку "Пуск", чтобы запустить пример проекта.

  9. Нажмите кнопку .

    Примечание.

    Два индикатора хода выполнения отображают ход выполнения текста. Один индикатор хода выполнения отображает ход выполнения в постоянном режиме, а другой индикатор хода выполнения отображает ход выполнения в порядке уменьшения или отсчета.