Пишем свой Progress Bar
Чтобы сделать Progress Bar достаточно иметь объект, на
котором можно рисовать. Например Picture Box.
Есть два метода прорисовки бара: линиями или закрашенным прямоугольником.
Наиболее быстрый способ второй, т.к. мы рисуем только одну линию по диагонали, а потом
делаем из неё закрашенный прямоугольник, в то время как в первом мы рисуем несколько
десятков линий. Но этот способ хорош тогда, когда Вы хотите сделать плавный градиент
в Вашем баре. Мы рассмотрим все 2 случая.
В первом случае мы рисуем линию из координат [0;0] (левый верхний угол)
Picture Box'а до [x;ширина объекта], где x - координата, меняющаяся в зависимости от
данного числа процентов. Поскольку эта координата - величина в пикселях, а мы
знаем только в процентах, то надо расчитать сколько пикселей состовляет один процент
Sub ShowProgress(Obj As Control, PVal As Integer)
Dim PNum As Double
If PVal > 100 Then Exit Sub
If Obj.BorderStyle = 1 Then
PNum = (Obj.Width - 4) / 100
Else
PNum = Obj.Width / 100
End If
Здесь ShowProgress - процедура для прорисовки бара, Obj - указатель на Picture Box, а
PVal - количество процентов. Далее мы объевляем переменную PNum, в которой будет
храниться количество пикселей на один процент. Её тип Double, а не Integer, т.к.
целого количества пикселей может и не быть. Например длина бара 30 пикселей, а
всего процентов 100, и получится, что один процент это 3.3333.... пикселей. VB округлит
это число до 3 и мы будем видеть недокрашенный бар, когда будет 100%
Далее идёт проверка на количество процентов: если больше 100, то выход.
В последнем блоке операторов условия мы и присваиваем это самое число. Проверка
на то, установлен ли параметер BorderStyle нужна для того, чтобы выяснить, есть ли рамочка.
Она состовляет 4 пикселя и лежит не снаружи объекта, а внутри, так что влияет на наши расчёты.
Теперь можно начать рисовать, но для начала нужно очистеть объект.
Obj.Cls
Теперь в центре объекта печатаем количество процентов.
If Obj.BorderStyle = 1 Then
Obj.CurrentX = (Obj.Width - 4) / 2 - Obj.TextWidth(PVal & "%") / 2
Obj.CurrentY = (Obj.Height - 4) / 2 - Obj.TextHeight(PVal & "%") / 2
Else
Obj.CurrentX = Obj.Width / 2 - Obj.TextWidth(PVal & "%") / 2
Obj.CurrentY = Obj.Height / 2 - Obj.TextHeight(PVal & "%") / 2
End If
Obj.Print PVal & "%"
Здесь мы опять проверяем параметер BorderStyle. Затем находим центер объекта и вычитаем из
него половину длины полученного текста. Это нужно, чтобы текст печатался не с центра, а
немного левее. Тогда надпись будет ровно в центре. Последний оператор выводит текст.
Осталось только нарисовать сам бар.
Obj.Line (0, 0)-(PNum * PVal, Obj.Height), , BF
Чтобы прямоугольник не закрасил надпись, а инверсировал её, нужно
указать в параметрах объекта свойство DrawMode равное 10 - Not Xor Pen.
Скачать модуль с этой процедурой можно с этой страницы.
Во втором случае мы должны рисовать много линий.
For I = 0 To (PNum * PVal)
Obj.Line (I, 0)-(I, Obj.Height)
Next I
Для плавного градиента можно изменить код так.
Dim ColorPerPix As Double
ColorPerPix = 255 / Obj.Width
For I = 0 To (PNum * PVal)
Obj.ForeColor = RGB(0, 0, ColorPerPix * I)
Obj.Line (I, 0)-(I, Obj.Height)
Next I
ColorPerPix - количество оттенков цветов на один пиксель.