Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Создание и регистрация управляющих элементов ActiveX

Нет ничего более простого и, одновременно, наиболее поражающего воображение программистов со старой практикой С++, чем создание управляющих элементов ActiveX (так называемых ActiveX Controls) из современных инструментальных средств программирования, таких как Delphi или Visual Basic. Современным разработчикам вовсе нет никакой необходимости досконально понимать сложную структуру встроенных интерфейсов, порой они даже не знают, что такое интерфейс iunknown и зачем нужны функции AddRef, Release и Queryinterface. Зачем им это? Теперь все за них проделывают встроенные в современные RAD-системы "мастера" и шаблоны.

Порой программисты вовсе не задумываются, какую работу проделывают за них TCP/IP и RPC, когда части приложения распределяются сразу на несколько систем при помощи "мастеров развертывания и инсталляции". Впрочем, об этом позже. Что же касается управляющих элементов ActiveX, то они являются первоосновой компонентного проектирования и программирования. Именно поэтому разработчики RAD-систем предельно облегчили работу по созданию таких строительных компонентов, из которых они и сами состоят почти на 80 процентов. Как создать и зарегистрировать на локальной, либо удаленной машине ActiveX-элемент, выполняющий некоторую полезную работу и который только при помощи буксировки с помощью мыши можно перетащить на палитру компонентов в RAD-системах или встроить в любое приложение, не исключая и Web-страницы, да так, чтобы его можно было сразу использовать? Как сделать, чтобы этот OCX-элемент мог загружаться и выполнять свою работу из браузера?

Предположим, вам очень часто приходится писать Интернет-приложения, в которых на Web-странице должно появляться окно со списком всех доступных на этой машине шрифтов. Не будете же вы, в самом деле, постоянно включать функцию на каком-нибудь JavaScript в каждый HTML-файл. Гораздо легче написать управляющий ActiveX-элемент. Попробуем сделать это на Visual Basic 6. Тут даже и программировать-то ничего не нужно. Запустим VB, выберем шаблон для приложения с элементом управления ActiveX и создадим в пустой форме стандартный элемент ListBox, также с помощью специального ActiveX- компонента, находящегося на стандартной палитре компонентов Visual Basic (рис. 1.7).

Рис. 1.7. Окно проекта для создания управляющих элементов ActiveX в VB 6

В свойствах ToolboxBitmap мы можем выбрать желаемую пиктограмму, в качестве которой создаваемый компонент будет присутствовать на палитрах компонентов в любой RAD-системе, в которой вы пожелаете его иметь. Далее нужно связать с этим компонентом какой-либо код. В нашем случае код должен быть самым примитивным — заполнение окошечка ListBox списком присутствующих на машине шрифтов. Программировать ничего не будем, возьмем стандартный код из примеров справочной системы VB 6 и "зальем" его в окно Modulel, который предварительно создадим по команде Project-> Add Module. Ниже приведен этот код.

 

'Font enumeration types
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64
Type LOGFONT
lfHeight As Long
IfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
IfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
IfPitchAndFamily As Byte
IfFaceName(LF_FACESIZE) As Byte
End Type

Type NEWTEXTMETRIC
tmHeight As Long tmAscent As Long
tmDescent As Long tmlnternalLeading
As Long tmExternalLeading As Long
tmAveCharWidth As Long tmMaxCharWidth As Long
tmWeight As Long tmOverhang As Long
tmDigitizedAspectX As Long tmDigitizedAspectY As Long
tmFirstChar As Byte tmLastChar As Byte
tmDefaultChar As Byte tmBreakChar As Byte
tmltalic As Byte tmUnderlined As Byte
tmStruckOut As Byte tmPitchAndFamily As Byte
tmCharSet As Byte ntmFlags
As Long ntmSizeEM As Long
ntmCellHeight As Long
ntmAveWidth As Long
End Type

' ntmFlags field flags Public Const NTM_REGULAR = &H40& Public Const
NTM_BOLD = &H20& Public Const NTM_ITALIC = &H1&
' tmPitchAndFamily flags Public Const TMPF_FIXED_PITCH = &H1 Public
Const TMPF__VECTOR = &H2 Public Const TMPF_DEVICE = &H8 Public Const
TMPF_TRUETYPE = &H4
Public Const ELF_VERSION = 0 Public Const ELF_CULTURE_LATIN = 0
' EnumFonts Masks
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4
Declare Function EnumFontFamilies Lib "gdi32" Alias
"EnumFontFamiliesA"
(ByVal hDC As Long, ByVal IpszFamily As String, _ ByVal
IpEnumFontFamProc As Long, LParam As Any) As Long Declare Function
GetDC Lib "user32" (ByVal hWnd As Long) As Long Declare Function
ReleaseDC Lib "user32" (ByVal hWnd As Long, _ ByVal hDC As Long) As Long
Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC,
ByVal FontType As Long, LParam As ListBox) As Long Dim FaceName
As String Dim FullName As String
FaceName = StrConv(lpNLF.IfFaceName, vbUnicode)
LParam.Addltem Left$(FaceName, InStr(FaceName, vbNullChar) —1)
EnumFontFamProc = 1 End Function
Sub FillListWithFonts(LB As ListBox) Dim hDC As Long LB.Clear
hDC = GetDC(LB.hWnd)
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
ReleaseDC LB.hWnd, hDC End Sub

 

Код интересен тем, что он работает с WinAPI 32 и использует его стандартные функции, что само по себе в VB очень и очень привлекательно, ибо наделяет его необыкновенной мощью при использовании стандартных библиотек Windows, таких как GDI32.DLL, USER32.DLL, но нам сейчас гораздо интереснее другое — как упаковать это в переносимый, пригодный для повторного использования и применения где угодно, даже на Web- страницах Интернета новый ActiveX-элемент? Нет ничего проще.

Продолжим работу в VB 6. После того как мы "залили" код в модуль, можно закрыть окно UserControl, и вы тотчас увидите выбранную вами пиктограмму в палитре инструментов. В окне UserControll в параметре initialize добавим строку Moduiei.FiiiListwithFonts Listi. Стандартная процедура должна выглядеть так, как показано на рис. 1.8.

Рис 1.8. Вызов функции модуля, реализующего функцию Windows API.

Ну вот и все, можно поздравить вас — вы создали первый ActiveX-элемент. Выполнить его непосредственно из Бэйсика еще нельзя, хотя можно сохранить под любым именем (расширение .осх файлу присвоится автоматически), но пока не будем делать этого, потому что такой шаг неизбежно связан с регистрацией нового элемента в системе (о ней мы расскажем позже). Попробуем использовать созданный нами управляющий элемент ActiveX.

Через меню File добавим еще один проект к уже имеющемуся (File->Add Project). Выберем для нового проекта шаблон Standard EXE. Появится пустая форма. Втащим в эту форму из палитры компонентов наш ActiveX- элемент и придадим ему необходимые размеры. Теперь, при желании, можно сохранить группу проектов под любым именем по команде меню FiIe-> Sace Project Group As, чтобы впоследствии продемонстрировать кому-нибудь ваши результаты или скорректировать проект.

Хранить разрабатываемые ActiveX-элементы и формы их использующие в одной группе проектов очень удобно, потому что отпадает необходимость вручную включать их каждый раз в палитру компонентов из гигантского списка компонентов, уже зарегистрированных на вашей машине. Попробуем выполнить группу проектов по команде меню Run из среды Visual Basic. То, что вы увидите на экране, показано на рис. 1.9.

Рис 1.9. Использование разработанного элемента ActiveX.

Как видите, запускается браузер по умолчанию, потому что используется файл с расширением .осх. Он временно регистрируется в системе и исполняется. Разумеется, с данным списком шрифтов пока ничего нельзя сделать (только просмотреть их), но ведь это только пример! Вы можете разрабатывать для себя или с целью перепродажи куда более изощренные управляющие элементы со множеством свойств и методов, способных реагировать на различные события. Главное — это понять принципы создания таких элементов и их последующего использования.

Охарактеризуем вкратце базовые понятия и ключевые объекты, из которых строятся управляющие элементы ActiveX.

     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru