| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Как создать ActiveX Control - 8 Создание ActiveX Control'а с дополнительной формой Представленные ранее статьи показывали создание различных по-сложности ActiveX Control'ов. Однако основной целью статей было не наращивание сложности от примера к примеру, а показ разнообразных возможностей в создании самих контролов. Сегодня на примере "простенького" ActiveX Control'a я покажу Вам принцип вывода дополнительных форм. Появляющаяся подсказка (ToolTipText) при позиционировании курсора на элементе формы имеет один существенный недостаток - вывод всего текста подсказки одной строкой, независимо от ее длины. Давайте создадим расширенный ToolTip. Назовем проект - ToolTipEx, а UserControl - TTEx. Разместим на контроле Image и вставим в него картинку размерами 24 х 24 или 32 х 32 пиксела. Аналогичную картинку, но 16 х 15 пиксел разместим в свойстве ToolboxBitmap нашего контрола. Установим свойство InvisibleAtRuntime = True. Добавим новую форму - меню Project/Add Form. Установим свойства новой формы: Name = frmToolTipEx, BackColor = &H00C0FFFF&, BorderStyle = 1 (Fixed Single), Caption[Пусто], ControlBox = False, Icon = [None], StartUpPosition = 0 (Manual), Width = 3000 (Twips). Разместим на форме лейбл: Name = lblTTEx, BackStyle = 0 (Transparent), Caption = "#", Left = 60, Top = 60, Width = 2880 (ширина формы минус 2 х 60 по краям).
Свойства контрола:
Метод:
NB! В методе принимаемый параметр мы вынуждены объявить как Object, иначе - появление ошибки о невозможности передачи пользовательского типа.
События: В данном примере мы не будем создавать пользовательские события.
Запишем наши свойства в окно кодов. Честно говоря, в данном случае трудно посоветовать пользоваться ли помощью мастера или нет. Т.к. приходится вносить достаточно много мелких исправлений в полученные шаблоны кодов. Решайте сами. Я покажу как должна выглядеть кодировка на примере одного свойства. Полностью описания свойств, как всегда, в листинге. Public Property Get Text() As String Public Property Let Text(ByVal New_Text As String) Private Sub UserControl_ReadProperties(PropBag As PropertyBag) Private Sub UserControl_WriteProperties(PropBag As PropertyBag) Остальные свойства делаются аналогичным образом. Единственное, что мы сейчас сделаем, это вставим проверку на наличие пустой строки в свойство Text. If New_Text = vbNullString Then Определим какие API-функции мы будем использовать:
Ну а теперь займемся процедурой ShowTTEx. В разделе Global объявим первые 2 функции, тип RECT и переменные, необходимые внутри программы (Private CaptionHeight As Long и Private PFrm As RECT 'позиция формы, содержащей UserControl) Public Sub ShowTTEx(ctrl As Object) ' Определяем, относительно чего мы будем позиционировать 'определяем высоту заголовка формы (ведь при разных разрешениях экрана - он разный) CaptionHeight = (GetSystemMetrics(SM_CYCAPTION) * Screen.TwipsPerPixelY) Вернемся к форме frmToolTipEx. В глобальных объявлениях выведем нашу последнюю, третью API-функцию. Создадим процедуру, изменяющую размеры формы: Public Sub FrmResize() А в Form_Load сделаем ссылки на них.
Теперь займемся тестированием. Добавим новый проект и разместим на форме наш контрол, ну и допустим кнопку и лейбл. Добавим коды: Option Explicit Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) With TTEx1 Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) With TTEx1 .Text = "Данный текст предназначен для показа возможностей нашего ActiveX Control'a" .BackColor = vbYellow .ForeColor = vbBlue With .Font .Bold = True .Italic = False .Name = "Arial Cyr" .Size = 10 End With .ShowTTEx Label1 End With End Sub У данного контрола есть определенные недостатки - например, для работы ему необходимо постоянное отслеживание события Mouse_Move, что определенно потребляет некоторое количество ресурсов. Воспользовавшись приведенными здесь кодами, Вы можете избежать этого, например, создав свой контрол TextBox с включенным в него событием ToolTipEx (как это делается см. статью 3). Данный пример учебный, а никак не 100% законченный контрол. Поэтому напоследок домашнее задание :-) а) когда вывод текста небольшой и в одну строку - отследите ширину контрола, чтобы не было пустого места справа; б) когда элемент, к которому выводится подсказка, находится близко к правому краю экрана - отследите позиционирование контрола, чтобы он не прятался за край. Успехов!
За листингом сюда:
[Назад][Содержание][Вперед] |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|