Вступление в создание ActiveX Control'ов
Создание контейнера с "плавающей" надписью.
Для того чтобы что-то создать необходимо попасть в среду программирования. Поэтому первым шагом будет запуск VB. Выбираем под ярлыком "New" создание ActiveX Control
Вначале определимся какие свойства, методы и события нам будут необходимы. Изначально хорошо спланировав - на переделки займем времени всего в 2 раза больше от запланированного :-)
Свойства:
Методы:
Контейнер - пассивный элемент, следовательно нужда в методах отсутствует
События:
Теперь самое время переназвать проект и сам контрол.
NB! Имена не должны повторяться.
Щелкнем правой клавишей в окне проектов на имене Project1 и в выпадающем меню выберем Project1 Properties В открывшемся диалоговом окне под надписью Project Name вписываем свое название проекта - в данном случае - contZygZag, а под надписью Project Description - Контейнер с "плавающей" надписью. Именно эта запись будет появляться у Вас потом, когда Вы будете выбирать свой контрол для установки в приложении. Нажимаем "ОК"
Далее вместо UserControl1 в свойстве Name напишем ZygZag, а так же выберем свойство ControlContainer и установим его в True.
Помещаем на контрол два стандартных элемента Label (Name = lblCaption, AutoSize = True, BackStyle = 0 (Transparent), Caption = ZygZag, Left = 0, Top = 0) и Timer (Interval = 100, Enabled = False). Теперь самое время сохранить проект.
Следующим этапом является написание кода. Воспользуемся для этого специальным мастером, предоставляемым нам VB. Выберите меню Add-Ins/Add-In ManagerВ диалоговом окне выберите ActiveX Ctrl Interface Wizard. Теперь он появился и в меню. Вызовем его. В первом шаге Wizard'а в правом списке (Selected names) оставим только те свойства и события, которые мы определили выше. Из левого списка туда же добавим те, которые VB не захотел поместить автоматически (Caption, Interval). Перейдем к следующему шагу. Допишем те свойства и события, которым мы дали свои названия (TimerOn - Property и CaptionClick - Event). В следующем шаге определимся в привязке всего выбранного к существующим элементам:
Public Name |
Control |
Member |
BackColor |
UserControl |
BackColor |
BorderStyle |
UserControl |
BorderStyle |
Caption |
lblCaption |
Caption |
CaptionClick |
lblCapton |
Click |
Click |
UserControl |
Click |
DblClick |
UserControl |
DblClick |
Font |
lblCaption |
Font |
ForeColor |
lblCaption |
ForeColor |
Interval |
Timer1 |
Interval |
MouseDown |
UserControl |
MouseDown |
MouseMove |
UserControl |
MouseMove |
MouseUp |
UserControl |
MouseUp |
TimerOn |
Timer1 |
Enabled |
Помечены все выбранные свойства и события - нажимаем кнопку "Finish". Код в черновике готов.
NB! Для тех кто пишет на VB5 (в VB6 эта ошибка исправлена) - внесите маленькие дополнения: в Private Sub UserControl_ReadProperties(PropBag As PropertyBag) - строка, где описывается Font должна звучать следующим образом - Set lblCaption.Font = PropBag.ReadProperty("Font", Ambient.Font); и аналогично в Private Sub UserControl_WriteProperties(PropBag As PropertyBag) - Call PropBag.WriteProperty("Font", lblCaption.Font, Ambient.Font)
Чтобы наш контейнер действительно стал КОНТЕЙНЕРОМ, т.е. самостоятельно мог вмещать в себя другие элементы, необходимо справа в окне Properties выбрать свойство ControlContainer и установить его в True.
Сохраним проект. Теперь самое время посмотреть, что же у нас получилось. Выберем меню File/Add Project и в диалоговом окне - Standart EXE. В окне проектов щелкните правой клавишей мыши на новом проекте и выберите контекстное меню Set As Start Up, чтобы при запуске он стартовал первым. Желательно (но совсем не обязательно) переименовать вновь созданный проект и форму, например prjTest и frmTest соответственно. Теперь на форме можно разместить свой ActiveX Control, выбрав его на панели со стандартными элементами
NB! Окно с самим элементом должно быть закрыто.
Поиграйте со свойствами - получается? Не все? Будем исправлять.
Вызывает некоторое удивление свойство BorderStyle - возможность устанавливать только числовые значения, и то если ввести допустим цифру 2, то возникает ошибка. Конечно можно сделать проверку на ограниченный ввод значений записав это в Property Let. Но давайте ограничим саму возможность ввода с клавиатуры, а сделаем только возможность выбора. Для этого в самом начале листа кодов, сразу после Option Explicit сделаем такую запись:
Public Enum constBorderStyle
Нет = 0
Окантовка = 1
End Enum
И, соответственно, изменим первые строки в Property для BorderStyle на Public Property Get BorderStyle() As constBorderStyle и Public Property Let BorderStyle(ByVal New_BorderStyle As constBorderStyle). А теперь снова откроем frmTest и посмотрим свойство BorderStyle - ну как? нравится?
А теперь самое главное опишем передвижение нашего Label по контролу. В области General создадим переменную: Private Motion As Integer.
И запишем передвижение:
Private Sub MoveZygZag()
Select Case Motion
Case 1
lblCaption.Move lblCaption.Left - 50, lblCaption.Top - 50
If lblCaption.Left <= 0 Then ' если ударяется о левую стенку, то меняет движение на противоположное
Motion = 2
ElseIf lblCaption.Top <= 0 Then ' если ударяется о верхнюю стенку,
'то меняет движение на противоположное; ну и так далее
Motion = 4
End If
Case 2
lblCaption.Move lblCaption.Left + 50, lblCaption.Top - 50
If lblCaption.Left >= (UserControl.Width - lblCaption.Width) Then
Motion = 1
ElseIf lblCaption.Top <= 0 Then
Motion = 3
End If
Case 3
lblCaption.Move lblCaption.Left + 50, lblCaption.Top + 50
If lblCaption.Left >= (UserControl.Width - lblCaption.Width) Then
Motion = 4
ElseIf lblCaption.Top >= (UserControl.Height - lblCaption.Height) Then
Motion = 2
End If
Case 4
lblCaption.Move lblCaption.Left - 50, lblCaption.Top + 50
If lblCaption.Left <= 0 Then
Motion = 3
ElseIf lblCaption.Top >= (UserControl.Height - lblCaption.Height) Then
Motion = 1
End If
End Select
End Sub
Добавим обработку события таймера:
Private Sub Timer1_Timer()
MoveZygZag
End Sub
И наконец, заключительный штрих - отцентруем Label и установим начальное направление движения:
Private Sub UserControl_Resize()
lblCaption.Move (UserControl.Width - lblCaption.Width) / 2, _
(UserControl.Height - lblCaption.Height) / 2
Motion = 1
End Sub
И на прощанье "повязываем бантик". Открываем Paint (или любой другой графический редактор) и рисуем картинку форматом 16 х 15 пикселов, сохраняем в формате BMP. Открываем наш UserControl и в свойстве ToolboxBitmap открываем нарисованную картинку.
В frmTest добавим командную кнопку и опишем ее событие - включение/выключение таймера:
Private Sub Command1_Click()
ZygZag1.TimerOn = Not ZygZag1.TimerOn
End Sub
Нажимаем F5 и тихо млеем над своим произведением.
В заключение компилируем наш ActiveX Control (меню File/Make contZygZag) - одновременно происходит прописывание его в реестр Windows Вашего компьютера.
Как и обещано, в конце привожу полный листинг создания этого учебного ActiveX Control'a.
1999 г