назад | содержание | вперед
Добавление компонента к проекту
Для добавления компонента к проекту в окне Project Group установите указатель на проекте ownControls и щелкните правой кнопкой мыши, затем выберите команду Add (Добавить) и затем значение UserControl. К нашему проекту будет добавлен еще один компонент. Назовите его ownslider. Откройте окно редактора кода и введите там следующий текст, описывающий необходимые свойства и переменные:
Dim rnlngValue As Long
Dim rnlngLimit As Long
Dim rnlngStep As Long
Public Property Get Value() As Long
Value = rnlngValue
End Property
Public Property Let Value(ByVal NewValue As Long)
If NewValue >= 0 Then rnlngValue == NewValue Else rnlngValue = 0
PaintView
PropertyChanged "Value"
End Property
Public Property Get Limit() As Long
Limit = rnlngLimit
End Property
Public Property Let Limit(ByVal NewLimit As Long)
If NewLimit > 0 Then rnlngLimit = NewLimit Else rnlngLimit = 1
PaintView
PropertyChanged "Limit"
End Property
Public Property Get Step() As Long
Step = rnlngStep End Property
Public Property Let Step(ByVal NewStep As Long)
If NewStep > 0 Then rnlngStep = NewStep Else rnlngStep = 1
PaintView
PropertyChanged "Step"
End Property
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Limit = PropBag.ReadProperty("Limit", 1000000)
Value = PropBag.ReadProperty("Value", 500000)
Step = PropBag.ReadProperty("Step", 1000)
End Sub
Private Sub UserControl WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Limit", Limit, 1000000
PropBag.WriteProperty "Value", Limit, 500000
PropBag.WriteProperty "Step", Step, 1000
End Sub
Private Sub UserControl_InitProperties ()
Limit = 1000000
Value = 500000
Step = 1000
End Sub
При изменении значения каждого из этих свойств запускается процедура перерисовки объекта:
Private Sub PaintView()
'установить позицию карандаша в верхний левый угол
CurrentX = 0
CurrentY = 0
'установить ширину линии в зависимости от признака фокуса
If HaveFocus Then DrawWidth = ScaleHeight / 50
Else DrawWidth = ScaleHeight / 500
'прорисовать белый прямоугольник по всей площади компонента
Line (0, 0)-(Width - 10, Height - 10), &H80000005, BF
'нарисовать синюю полоску в зависимости от значения Value
Line (0, 0)-((Value / Limit) * Width - 10, Height - 10), &H8000000D, BF
'отобразить значение Value в текстовой форме поверх изображения желтым цветом с контрастной черной тенью
ForeColor = &HO&
CurrentX = 10
CurrentY = Height /2-90
Print Value
ForeColor = &HFFFF&
CurrentX = 0
CurrentY = Height / 2 - 100
Print Value
'нарисовать ограничивающую рамку
Line (0, 0)-(Width - 10, Height - 10), &НО, В
End Sub
При возникновении события paint также следует вызывать перерисовку, так как это событие происходит всякий раз, когда системе требуется отобразить объект:
Private Sub UserControl_Paint()
PaintView
End Sub
Для контроля за фокусом предусмотрим переменную HaveFocus, значение которой будет устанавливаться при возникновении событий GotFocus и LostFocus. Таким образом, когда наш объект имеет фокус, значение переменной HaveFocus равно True, в противном случае HaveFocus имеет значение False.
Dim HaveFocus As Boolean
Private Sub UserControl_GotFocus()
HaveFocus = True
PaintView
End Sub
Private Sub UserControl_LostFocus()
HaveFocus = False
PaintView
End Sub
Чтобы обрабатывать нажатие клавиш <<--> и <-->>, установим в окне Properties для свойства Keypreview компонента значение True и опишем реакцию на событие KeyDown:
Private Sub UserControl KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyLeft
Value = Value - Step
Case vbKeyRight
Value = Value + Step
End Select
End Sub
Как вы видите, нет необходимости заниматься перерисовкой, поскольку она автоматически происходит при присвоении нового значения свойству value.
назад | содержание | вперед