Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Использование ActiveX-элементов с Windows Forms в Visual Studio .NET
В этой статье рассказывается об использовании элементов управления Microsoft ActiveX с Windows Forms в Microsoft Visual Studio .NET.

Аннотация

В этой статье рассказывается об использовании элементов управления Microsoft ActiveX с Windows Forms в Microsoft Visual Studio .NET.

Цели

  • Определение элементов управления ActiveX и Windows Forms.
  • Объяснение принципов работы ActiveX-элементов в Windows Forms.
  • Описание способов обновления проектов, содержащих ActiveX-элементы.

Требования к программному обеспечению и уровню подготовки читателей

Чтобы извлечь максимальную пользу из этого документа, нужно:

  • понимать, что такое ActiveX-элементы;
  • иметь опыт разработки Windows-форм с использованием Visual Basic 6.0 и ActiveX-элементов;
  • установить на одном компьютере Visual Basic 6.0 и Visual Basic .NET (это не проблема, поскольку они способны "мирно" сосуществовать на одной машине).

Отличия между элементами управления ActiveX и Windows Forms

С выпуском Microsoft® Visual Studio® .NET Microsoft ввела в использование новую технологию разработки приложений для Microsoft Windows®. Одним из ее компонентов являются формы Windows Forms, общие для всех языков, которые работают в исполняющей среде Microsoft .NET. Windows Forms отличаются от форм, к которым привыкли программисты на Microsoft Visual Basic®, хотя на первый взгляд они могут показаться идентичными.

Помимо нового ядра в Windows Forms имеется новый набор элементов управления. Они не базируются на технологии Microsoft ActiveX®, как это было в предыдущих версиях Visual Basic. Новые элементы управления построены на основе Microsoft .NET Framework и класса System.Windows.Forms.Control.

Если раньше вы писали на Visual Basic приложения с пользовательским интерфейсом, то почти наверняка размещали на их формах элементы управления ActiveX (ActiveX-элементы). Если вы собираетесь портировать существующие приложения из Visual Basic в Visual Basic .NET, то, возможно, вам любопытно, как отразится такой перенос на ActiveX-элементах. И наверное, вас интересует, что делать с теми элементами управления, для которых нет эквивалентов в Windows Forms.

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

Особенности элементов управления Windows Forms

Скорее всего у вас позади несколько лет работы с ActiveX-элементами. Эти элементы разработаны на основе COM, привязанной к платформе Windows. Элементы управления Windows Forms являются частью .NET Framework, и, казалось бы, при портировании .NET Framework на другую операционную систему они должным остаться доступными, но это не так, поскольку Windows Forms интенсивно использует Win32 API. В конце концов, их архитектура рассчитана на то, чтобы в полной мере задействовать преимущества платформы Windows.

Некоторые функции элементов управления Windows Form, такие как Dock и Anchor, не поддерживаются ядром форм Visual Basic 6.0, но доступны почти любому элементу управления Windows Forms - по аналогии с тем, как свойства Top и Left доступны любому видимому ActiveX-элементу.

Элементы управления Windows Forms являются объектами - так же, как и ActiveX-элементы в Visual Basic 6.0. Теперь благодаря механизму наследования в .NET Framework стало возможным истинное наследование от элементов управления Windows Forms в любом языке, поддерживаемом .NET, включая Visual Basic .NET. Это означает, что вы можете создавать классы, производные от классов элементов управления, что до сих пор было невозможно. И действительно, при разработке собственных элементов управления часто прибегают к наследованию от System.Windows.Forms.Control, чтобы получить доступ к базовым сервисам этого класса.

Использование ActiveX-элементов на формах Windows Forms

К счастью, большинство ActiveX-элементов можно без проблем использовать с Windows Forms. Чтобы убедиться в этом на практике, запустите Visual Studio .NET, создайте на Visual Basic .NET новое Windows-приложение (на основе шаблона Windows Application) и назовите его AxTest1.

При открытии проекта форма Form1 автоматически загрузится в дизайнер Windows Forms. Если провести мышью влево над ярлычком Toolbox, откроется одноименная панель с набором элементов управления Windows Forms. Конечно же, это не ActiveX-элементы, так что собственные ActiveX-элементы придется добавлять в Toolbox самостоятельно. Для этого щелкните Toolbox правой кнопкой мыши и выберите команду Customize Toolbox, чтобы вызвать диалоговое окно Customize Toolbox (рис. 1).

Рис. 1. Окно Customize Toolbox позволяет добавлять ActiveX-элементы в Toolbox

В соответствии с задачами нашего примера добавим в Toolbox элемент управления из Visual Basic 6.0. В Windows Form есть его эквивалент, но в идеале для тестирования надо использовать то, что уже есть на вашем компьютере. Прокрутите список вниз, установите флажок Microsoft DBList Control, version 6.0 (рис. 1) и щелкните OK.

В результате в Toolbox появится элемент управления DBList, как показано на рис. 2. Заметьте, что в Toolbox ничто не говорит о том, что DBList - ActiveX-элемент. Теперь этот элемент управления можно помещать на форму так же, как в Visual Basic 6.0.

Рис. 2. ActiveX-элемент DBList, добавленный в Toolbox

Поместите элемент управления DBList на форму, перетащив или дважды щелкнув его. После этого станет ясно, что у него не все так, как было в Visual Basic 6.0.

Во-первых, у него теперь другое имя. Если бы вы добавили этот элемент управления на форму Visual Basic 6.0, он получил бы по умолчанию имя DBList1. Visual Basic .NET предваряет имя любого ActiveX-элемента, добавляемого на форму Windows Forms, префиксом "Ax" - по этому признаку их можно легко отличить.

Далее взгляните на свойства AxDBList1 в окне Properties. Видно, что они разные в Visual Basic 6.0 и Visual Basic .NET. Ниже приводятся некоторые свойства, которые появляются в Visual Basic .NET, но отсутствуют в Visual Basic 6.0:

  • Accessible Description;
  • Accessible Name;
  • Anchor;
  • Dock.

Некоторые свойства, напротив, отсутствуют в Visual Basic .NET. Так, среди свойств, отображаемых в Visual Basic .NET, нет DragIcon и DragMode, поскольку в Windows Forms механизм drag-and-drop работает иначе. Заметьте, что свойства Custom также нет в Visual Basic .NET. Чтобы открыть страницу нестандартных свойств элемента управления, щелкните ссылку ActiveX - Properties в списке Properties (эта ссылка обведена красным на рис. 3).

Рис. 3. Чтобы открыть страницу нестандартных свойств ActiveX-элемента, щелкните ссылку ActiveX - Properties

Использование новых свойств

Судя по списку, показанному выше, у нашего элемента управления оказалось несколько свойств, которых у него не было в Visual Basic 6.0, например, Anchor и Dock. Откуда взялись эти свойства, ведь их не было у этого ActiveX-элемента?

У ActiveX-элементов есть ряд общих свойств, известных как свойства объекта Extender (extender properties): Left, Right, Visible и др. Ядро Windows Forms заменяет такие свойства ActiveX-элементов собственным набором свойств. Это делается путем создания для каждого ActiveX-элемента оболочки Windows Forms, комбинирующей extender-свойства ActiveX и новые свойства Windows Forms.

В Windows Forms поддерживаются как extender-свойства, так и наследуемые. Некоторые из новых свойств, такие как Dock и Anchor, на самом деле наследуются от базового класса System.Windows.Forms.Control. Extender-свойства определяются контейнером элемента управления, а не его базовым классом. Пример - свойство ToolTip, доступное лишь после добавления элемента управления ToolTipProvider.

Хотя эти механизмы кажутся очень сложными, они, к счастью, "прозрачны" для разработчика. Как уже говорилось, чтобы открыть страницу свойств, достаточно щелкнуть ссылку внизу списка свойств. Остальные свойства отображаются в окне Properties, где ими можно манипулировать независимо от того, являются ли они изначально extender-свойствами ActiveX, свойствами Windows Forms или унаследованными свойствами.

Взгляните на свойство Dock. В Visual Basic 6.0 этого свойства у элемента управления DBList не было. Если щелкнуть кнопку со стрелкой рядом с именем свойства Dock, откроется небольшое окно, в котором можно выбрать, куда должен пристыковаться этот элемент управления. На рис. 4 разработчик выбрал пристыковку AxDBList1 к правой стороне формы. В результате после запуска приложения AxDBList1 будет пристыкован к форме с правой стороны. При изменении размеров формы размер этого элемента управления автоматически изменится соответствующим образом. Это позволяет экономить массу времени, поскольку писать соответствующий код самостоятельно не требуется. На рис. 5 показано, как пристыкованный элемент управления автоматически масштабируется при изменении размеров формы.

Рис. 4. Windows Forms придает ActiveX-элементам новые свойства вроде Dock

Рис. 5. Свойство Dock позволяет ActiveX-элементу автоматически изменять свои размеры и оставаться в той области экрана, к которой он пристыкован

ActiveX-элементы, не работающие в Windows Forms

Хорошая новость в том, что большинство элементов управления просто замечательно работают в Windows Forms, но "большинство" не значит "все". Например, некоторые элементы управления, такие привычные в Visual Basic 6.0, например Line и Shape, не работают в Windows Forms. Visual Basic 6.0 поддерживает так называемые безоконные элементы управления, а Visual Basic .NET не допускает использование безоконных элементов управления, превращая их в оконные. Такой процесс может привести к непредсказуемым результатам, поэтому элементы управления Line и Shape исчезли в Visual Basic .NET. Лучшая альтернатива Line, отсутствующему в Visual Basic .NET, - применение библиотеки GDI+ или метки (label), у которой свойство Height равно 1 пикселу, а BorderStyle = FixedSingle. Вместо Shape можно использовать библиотеку GDI+.

В Windows Forms не работают и такие ActiveX-элементы, как UpDown, ssTab и Coolbar. UpDown (входит в Microsoft Windows Common Controls - 2) неприменим в Windows Forms, поскольку там его полоса прокрутки не подключается к связанному с ней текстовому полю (buddy). Элемент управления ssTab (Microsoft Tabbed Dialog Control) не удается использовать из-за того, что в Windows Forms на нем нельзя размещать другие элементы управления ActiveX или Windows Forms. Но не беспокойтесь об этом: для большинства неподдерживаемых элементов управления предусмотрены функционально эквивалентные элементы управления Windows Forms (например, для ssTab таким эквивалентом является TabControl).

Наличие Line, Shape, ssTab, UpDown и других элементов управления, не поддерживаемых Windows Forms, создает при обновлении проектов Visual Basic 6.0 в Visual Basic .NET проблемы, которым посвящен следующий раздел.

Обновление проектов, содержащих ActiveX-элементы

Учитывая большое число существующих проектов на Visual Basic 6.0, нетрудно предсказать, что многие неизбежно столкнутся с необходимостью портирования приложений, написанных на Visual Basic 6.0, в Visual Basic .NET. К счастью, в Visual Basic .NET есть Upgrade Wizard, облегчающий эту задачу. Хотя этот масте работает неплохо, одного его недостаточно. Посмотрим, что происходит при обновлении приложения с ActiveX-элементами при использовании мастера.

По умолчанию Upgrade Wizard пытается заменить все ActiveX-элементы эквивалентными элементами управления Windows Forms. Чтобы понять, как это происходит на практике, создадим простой проект и попробуем обновить его.

Обновление простого приложения на Visual Basic 6.0

Запустите Visual Basic 6.0 и создайте новое приложение по шаблону Standard EXE. Добавьте на форму метку, текстовое поле, кнопку и нарисуйте линию. Затем поместите на форму элемент управления Shape и измените его свойства так, чтобы он стал залитой окружностью. При этом реальный вид формы не имеет значения (например, он может быть таким, как на рис. 6).

Рис. 6. Простое приложение на Visual Basic 6.0 до обновления

Сохраните проект в файле SimpleUpgrade.vbp, после чего запустите Visual Basic .NET и откройте в нем проект. В окне Open Project найдите каталог, где сохранен SimpleUpgrade.vbp. Чтобы увидеть файлы с расширением .vbp, в раскрывающемся списке Files выберите Visual Basic Project Files. При открытии SimpleUpgrade.vbp в Visual Basic .NET автоматически запускается Visual Basic Upgrade Wizard.

Оставьте без изменения настройки мастера, заданные по умолчанию, кроме имени проекта (3-й шаг мастера). После обновления изучите получившийся проект.

В окне Solution Explorer найдите файл _UpgradeReport.htm. Дважды щелкнув его, вы увидите, что при обновлении возникли две ошибки: элемент управления Shape и свойство Shape1.Shape не обновлены. Вы уже знаете, что элементы управления Shape и Line отсутствуют в Visual Basic .NET, но сообщений об ошибках, связанных с Line, не было. Почему? Откройте Designer, дважды щелкнув форму.

Нетрудно заметить, что вид формы почти не отличается от такового в Visual Basic 6.0, только окружность превратилась в прямоугольник (рис. 7). Линия тоже не изменилась, но если ее щелкнуть, станет ясно, что это вовсе не линия. Выбрав линию, взгляните на окно Properties. Хотя у бывшего элемента управления Line осталось имя Line1, на самом деле это метка (объект System.Windows.Forms.Label) - просто ее свойство Height установлено равным 1 пикселу, а свойство BorderStyle - в FixedSingle. Желтый прямоугольник, бывший элементом управления Shape, также превратился в Label. Если аналогичным образом проверить кнопку или текстовое поле, можно убедиться, что они стали объектами класса System.Windows.Forms. Это означает, что они заменены соответствующими элементами управления Windows Forms.

Рис. 7. Простая форма, созданная в Visual Basic 6.0, после обновления в Visual Basic .NET

Обновление более сложных приложений, написанных на Visual Basic 6.0

Вернитесь в Visual Basic 6.0 и создайте новый проект Standard EXE. Добавьте на форму метку и текстовое поле. Скопируйте текстовое поле в буфер обмена и вставьте его оттуда; щелкните Yes, чтобы создать массив элементов управления. Теперь на форме одна метка и два текстовых поля, объединенных в массив.

Измените значение свойства DragMode у Label на 1 - Automatic и дважды щелкните текстовое поле Text1(0), чтобы вызвать окно кода. Внесите в обработчик события Text1(0) DragDrop следующие изменения:

 Private Sub Text1_DragDrop(Index As Integer, _
    Source As Control, X As Single, Y As Single)
    Text1(0).Text = Label1.Caption
 End Sub

Теперь, если перетащить метку на поле Text1(0), код поместит ее текст в свойство Text1(0).Text.

Далее в окне кода выберите из раскрывающегося списка procedure обработчик события Change и добавьте в него следующий код:

 
 Private Sub Text1_Change(Index As Integer)
     Text1(1).Text = Now
 End Sub

В результате при изменении значения свойства Text текстового поля генерируется событие Change. При перетаскивании метки на любое из текстовых полей строка заголовка метки попадет в свойство Text1(0).Text, при этом изменение значения этого свойства тут же вызывает событие Change. В результате будет выполнен код обработчика события Change, который заносит в свойство Text1(1).Text текущие дату и время.

Сохраните проект в файле MoreComplexUpgrade.vbp, после чего запустите Visual Basic .NET и обновите этот проект. Изучите файл _UpgradeReport.htm: там вы найдете одну ошибку и одно предупреждение (рис. 8).

Рис. 8. Ошибки, возникшие при обновлении событий drag-and-drop

Как видите, Visual Basic .NET пришлось нелегко при обновлении тех частей приложения, которые связаны с событиями drag-and-drop.

Взглянув на форму, можно заметить и другие отличия между ее видом в Visual Basic 6.0 и в Visual Basic .NET. В component tray (небольшом окне под формой) находятся два элемента управления: Text1 и ToolTip1. Visual Basic .NET обрабатывает массивы компонентов иначе, чем Visual Basic 6.0, поэтому он создает в component tray элемент управления типа Microsoft.VisualBasic.Compatibility.Visual Basic 6.0.TextBoxArray. Уровень совместимости (compatibility layer) необходим здесь для облегчения портирования приложения из Visual Basic в Visual Basic .NET. Однако по возможности следует избегать использования уровня совместимости, поскольку он работает медленнее, чем "родные" элементы управления Windows Forms.

ToolTip1 находится в component tray, поскольку у элементов управления Windows Forms нет свойства ToolTip. Вместо него они используют расширяемую архитектуру extender. ToolTip1 добавляется, чтобы обеспечить поддержку всплывающих подсказок тем элементам управления, для которых это необходимо. Другим примером провайдера extender-свойств служит HelpProvider, добавляющий к элементам управления свойства, связанные с поддержкой справочных систем.

Проверив имена текстовых полей, вы заметите, что они изменились. Первое поле теперь называется Text1_0, а второе - Text1_1. В Visual Basic .NET массивы элементов управления обрабатываются с использованием других имен объектов, и, следовательно, других методов.

Резюме

Итак, вы узнали, как пользоваться ActiveX-элементами в приложениях Windows Forms. К счастью, многие из них прекрасно работают в Windows Forms. Однако в силу ряда причин некоторые элементы управления из Visual Basic все же не работают в Windows Forms. Во избежание путаницы лучше по возможности пользоваться элементами управления Windows Forms. Также помните, что:

  • массивы элементов управления обрабатываются в коде с использованием имен и методов, отличных от таковых для индивидуальных элементов управления;
  • страница нестандартных свойств ActiveX-элементов доступна через ссылку, расположенную под списком свойств в окне Properties;
  • ActiveX-элементы автоматически получают некоторые свойства элементов управления Windows Forms, например Anchor и Dock;
  • элементы управления Line и Shape в Visual Basic .NET заменяются элементом управления Label;
  • механизм drag-and-drop в Visual Basic .NET работает по-другому; при этом автоматического обновления соответствующего кода не происходит. Если вы часто используете drag-and-drop, после обновления проектов придется модифицировать соответствующий код вручную.

Об авторе

Крэйг Атли (Craig Utley) - президент компании CIO Briefings LLC, занимающейся консалтингом и обучением разработке с использованием технологий Microsoft. С самых первых дней .NET Крэйг работал с этой технологией и писал о ней. Недавно он подготовил для издательства Sams Publishing и компании Volant Training серию материалов, посвященных .NET.

О группе Informant Communications

Informant Communications Group, Inc. (www.informant.com) - медиа-компания с разносторонними интересами в секторе информационных технологий. Специализируется на выпуске изданий и каталогов, проведении конференций и создании Web-сайтов, посвященных разработке ПО. Основанная в 1990 году и имеющая отделения в США и Великобритании, ICG получила признание как интегратор медийного и маркетингового контента, успешно удовлетворяя растущую потребность IT-профессионалов в качественной технической информации.

© 2001, Informant Communications Group и Microsoft Corporation

Научное редактирование выполнено PDSA, Inc.


Может пригодится:


Автор: Крэйг Атли
Прочитано: 4455
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру