ActiveX

Урок 1

Вступление в создание 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 г

Hosted by uCoz