Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье содержатся сведения о создании пользовательского элемента UserControl для создания плавного прокручиваемого элемента управления ProgressBar.
Исходная версия продукта: Visual C#
Исходный номер базы знаний: 323116
Итоги
В этой статье показано, как создать простой, настраиваемый UserControl для создания плавного прокручиваемого элемента управления ProgressBar.
В более ранних версиях элемента управления ProgressBar, например версия, предоставляемая элементом ActiveX Для общих элементов управления Microsoft Windows, можно просмотреть ход выполнения в двух разных представлениях. Для управления этими представлениями используйте свойство Прокрутки, которое включает стандартные и гладкие параметры. Гладкая прокрутка создает твердый блок цвета, который представляет ход выполнения, и стандартное прокрутка отображается сегментировано и состоит из ряда небольших блоков или прямоугольников.
Элемент управления ProgressBar, включенный в Microsoft Visual C#, поддерживает только стандартный параметр.
В примере кода в этой статье показано, как создать элемент управления, поддерживающий следующие свойства:
- Минимальное: это свойство получает или задает меньшее значение для диапазона допустимых значений для хода выполнения. Значение по умолчанию этого свойства равно нулю (0); Это свойство нельзя задать для отрицательного значения.
- Максимальное значение: это свойство получает или задает верхнее значение диапазона допустимых значений для хода выполнения. Значение по умолчанию этого свойства равно 100.
- Значение: это свойство получает или задает текущий уровень хода выполнения. Значение должно находиться в диапазоне, который определяют минимальные и максимальные свойства.
- ProgressBarColor: это свойство получает или задает цвет индикатора выполнения.
Создание пользовательского элемента управления ProgressBar
Выполните следующие действия, чтобы создать проект библиотеки элементов управления Windows в Visual C#:
Запустите Microsoft Visual Studio.
В меню Файл выберите пункт Создать и затем пункт Проект.
В диалоговом окне "Создать проект" щелкните Visual C# в разделе "Типы проектов" и выберите библиотеку элементов управления Windows Forms в разделе "Шаблоны".
В поле "Имя" введите SmoothProgressBar и нажмите кнопку "ОК".
В обозревателе проектов переименуйте модуль класса по умолчанию из UserControl1.cs в SmoothProgressBar.cs.
В окне свойств объекта UserControl измените свойство Name с UserControl1 на SmoothProgressBar.
На этом этапе обычно наследуется от класса этого элемента управления, а затем добавляется дополнительная функциональность для расширения существующего элемента управления. Однако класс 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)); }
В меню "Сборка " щелкните "Создать решение ", чтобы скомпилировать проект.
Создание примера клиентского приложения
В меню Файл выберите пункт Создать и затем пункт Проект.
В диалоговом окне "Добавление нового проекта" нажмите кнопку Visual C# в разделе "Типы проектов", щелкните "Приложения Windows Forms" в разделе "Шаблоны" и нажмите кнопку "ОК".
Выполните следующие действия, чтобы добавить два экземпляра элемента управления SmoothProgressBar в форму:
В меню Сервис выберите пункт Выбрать элементы панели элементов.
Перейдите на вкладку "Компоненты платформа .NET Framework".
Нажмите кнопку "Обзор", а затем найдите файл SmoothProgressBar.dll , созданный в разделе "Создание пользовательского элемента управления ProgressBar".
Нажмите кнопку ОК.
Примечание.
Элемент управления SmoothProgressBar добавляется на панель элементов.
Перетащите два экземпляра элемента управления SmoothProgressBar из панели элементов в форму проекта приложения Windows по умолчанию.
Перетащите элемент управления Таймера из панели элементов в форму.
Добавьте следующий код в
Tick
событие элемента управления Таймер:if (this.smoothProgressBar1.Value > 0) { this.smoothProgressBar1.Value--; this.smoothProgressBar2.Value++; } else { this.timer1.Enabled = false; }
Перетащите элемент управления Button из панели элементов в форму.
Добавьте следующий код в
Click
событие элемента управления Button:this.smoothProgressBar1.Value = 100; this.smoothProgressBar2.Value = 0; this.timer1.Interval = 1; this.timer1.Enabled = true;
В меню отладки нажмите кнопку "Пуск", чтобы запустить пример проекта.
Нажмите кнопку .
Примечание.
Два индикатора хода выполнения отображают ход выполнения текста. Один индикатор хода выполнения отображает ход выполнения в постоянном режиме, а другой индикатор хода выполнения отображает ход выполнения в порядке уменьшения или отсчета.