InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Создаем свой ActiveX Control


Михаил Эскин


Почему я, не будучи профессиональным программистом, написал эту статью-пример. Так сложилась ситуация, что я начал изучать VB в окружении, где никто этим не занимался, и это продолжалось достаточно долго. Так что посоветоваться с кем-то не предоставлялось возможности. Искать приходилось по крохам. Поэтому сейчас, когда Борис Рудой стал публиковать мои наработки, ко мне стали приходить письма с просьбами написать какой-либо ActiveX для их программ. А почему не сами?

 

Проанализировав корреспонденцию напрашивается три основных ответа:
  1. не умееют
  2. нужен только для одной какой-то конкретной программы и неохота тратить на это время (хотя само по-себе это противоестественно, ActiveX Control'ы и придумывались как раз для многоразового использования)
  3. не хотят

Последние две предпосылки как-то не вдохновляют для написания статьи J , а вот первая… Собственно говоря она и послужила толчком для этой статьи. Пусть кому-то будет чуть-чуть легче в освоении VB, чем мне в свое время.Visual Basic предполагает три основных пути для создания ActiveX Control'ов, это:

  • непосредственное написание "с нуля" - самый мобильный, но зато и самый трудный для создания путь
  • добавление новых свойств, методов и событий к уже имеющимся
  • комбинация нескольких объектов с выделением собственных свойств, методов, событий.

Последний путь самый легкий и поэтому наиболее часто встречаемый. Не претендуя на всю полноту охвата описать создание ActiveX Control мне бы хотелось, чтобы эта статья подтолкнула Вас к собственному творчеству. Итак создадим поэтапно ActiveX Control.

Запускаем VB и выбираем под ярлыком "New" создание ActiveX Control

Предположим мы создаем контейнер с плавающей надписью. Вначале определимся какие свойства, методы и события нам будут необходимы. Изначально хорошо спланировав - на переделки займем времени всего в 2 раза больше от запланированного

Свойства:

  • BackColor - цвет фона контрола
  • BorderStyle - наличие рамки вокруг контрола
  • Caption - текст надписи
  • Font - шрифт надписи
  • ForeColor - цвет надписи
  • TimerOn - включение/выключение таймера
  • Interval - частота обращения к таймеру

Методы:

Контейнер - пассивный элемент, следовательно нужда в методах отсутствует

События:

  • Click - при щелчке по контролу
  • DblClick - при двойном щелчке по контролу
  • CaptionClick - при щелчке по надписи
  • MouseDown - при нажатии клавиши мыши
  • MouseMove - при перемещении курсора над контролом
  • MouseUp - при отпускании клавиши мыши

Теперь самое время переназвать проект и сам контрол. Имена не должны повторяться. Щелкнем правой клавишей в окне проектов на имене Project1 и в выпадающем меню выберем Project1 Properties… В открывшемся диалоговом окне под надписью Project Name вписываем свое название проекта - в данном случае - contZygZag, а под надписью Project Description - Контейнер с "плавающей" надписью. Именно эта запись будет появляться у Вас потом, когда Вы будете выбирать свой контрол для установки в приложении. Нажимаем "ОК"

Далее вместо UserControl1 в свойстве Name напишем ZigZag, а так же выберем свойство ControlContainer и установим его в True.

Помещаем на контрол два стандартных элемента Label (Name = lblCaption, AutoSize = True, BackStyle = 0-Transparent, Caption = ZigZag, 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)

Сохраним проект. Теперь самое время посмотреть, что же у нас получилось. Выберем меню File/Add Project и в диалоговом окне - Standart EXE. В окне проектов щелкните правой клавишей мыши на новом проекте и выберите контекстное меню Set As Start Up, чтобы при запуске он стартовал первым. Желательно (но совсем не обязательно) переименовать вновь созданный проект и форму, например prjTest и frmTest соответственно. Теперь на форме можно разместить свой ActiveX Control, выбрав его на панели со стандартными элементами (окно с самим элементом должно быть закрыто). Поиграйте со свойствами - получается? Не все? Будем исправлять.

Вызывает некоторое удивление свойство 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.

[Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua