Статья от том, как самому создать элемент управления Progress Bar.
Progress Bar - это элемент на форме, который используется для индикации прогресса выполнения операции. Он состоит из прямоугольной формы, которая постепенно закрашивается определённым цветом (FloodColor) слева направо. В нашем случае мы создадим такой элемент управления, только он будет немного отличаться от стандартного. Сначала создайте новый ActiveX проект, назовём его ProgressBR, а пользовательское управление - ProgressBar. Свойства ControlContainer и AutoRedraw установите равными True. В мастере интерфейса элемента ActiveX (ActiveX Control Interface Wizard) из стандартных элементов выберите:
BackColor - цвет фона. BorderStyle - стиль рамки. Click DblClick Font -шрифт. ForeColor - цвет текста. KeyDown KeyPress KeyUp MouseDown MouseMove MouseUp
Нажмите кнопку Далее и добавьте следующие пользовательские свойства:
Text - текст, который будет отображаться на элементе управления. Value - значение прогресса (от 0 до 100). FloodColor - цвет заполнения прогресса.
Перейдите к следующему шагу в мастере и для всех стандартных свойств и событий (кроме BorderStyle и пользовательских элементов) установите параметр Control равным UserControl. Перейдите к последнему шагу - Установка Атрибутов. Для оставшихся свойств установите следующие значения:
BorderStyle, тип данных (Data Type) - Variant Text, тип данных - String Value, тип данных - Integer, значение поумолчанию (Default Value) - 50 FloodColor, тип данных - OLE_COLOR, значение по умолчанию - &H800000 (тёмно - синий)
Завершаем работу с мастером и переходим в код формы. Для рисования рамки нам потребуется API функция DrawEdge, тип RECT, константы: BDR_RAISEDINNER, BDR_SUNKENOUTER, BF_RECT. Создадим перечисление стилей рамки и кое - что исправим в коде:
Public Enum BS Нет = 0 Выдавленный = 1 Вдавленный = 2 End Enum
Исправьте в вашем коде следующие значения:
Dim m_BorderStyle As BS Const m_def_BorderStyle = 2
Public Property Get BorderStyle() As BS BorderStyle = m_BorderStyle End Property
Public Property Let BorderStyle(ByVal New_BorderStyle As BS) m_BorderStyle = New_BorderStyle PropertyChanged "BorderStyle" End Property
Мы создали три стиля рамки для нашего контрола, теперь создадим главную функцию, где будет отрисовываться сам элемент:
Private Sub Draw() Cls 'очищаем элемент управления
DrawMode = 14 'переходим в этот режим рисования, чтобы текст, находящийся в области заполнения был инвертирован CurrentX = (ScaleWidth - TextWidth(m_Text)) 2 'определем координаты X и Y, чтобы текст печатался в середине элемента управленя CurrentY = (ScaleHeight - TextHeight(m_Text)) 2 Print m_Text 'печатаем текст Line (0, 0)-(Value * (ScaleWidth / 100) * 1, ScaleHeight), m_FloodColor, BF 'рисуем полосу прогресса
DrawMode = 13 'переходим в обычный режим рисования и отображаем рамку Select Case m_BorderStyle Dim edge As RECT Case 0 Line (0, 0)-(ScaleWidth, ScaleHeight), BackColor, B Case 1 edge.Left = 0 edge.Top = 0 edge.Right = ScaleWidth / 15 edge.Bottom = ScaleHeight / 15 DrawEdge hdc, edge, BDR_RAISEDINNER, BF_RECT Case 2 edge.Left = 0 edge.Top = 0 edge.Right = ScaleWidth / 15 edge.Bottom = ScaleHeight / 15 DrawEdge hdc, edge, BDR_SUNKENOUTER, BF_RECT End Select End Sub
Осталось только указать, когда будет отрисовываться элемент управления: в событиях UserControl_Resize и UserControl_Show, а также в свойствах (Value, Text, BorderStyle, Font ...). Скачать Progress Bar можно из раздела ActiveX.