wxWidgets

Кросс-платформенная библиотека для создания пользовательского интерфейса

В прошлом номере "КВ", рассуждая о некоторых особенностях создания кросс-платформенных приложений, я упомянул дороговизну библиотеки Qt, предназначенной для написания на C++ кросс-платформенных приложений с графическим пользовательским интерфейсом. Среди наших читателей нашлись те, кто прислал письма, в которых они писали о том, что Qt - не единственная из подобных библиотек.

Правда, в качестве её альтернативы обычно называли GTK+. Но эта библиотека, несмотря на полную бесплатность и открытость исходных кодов, имеет множество серьёзных минусов. Правильно, пожалуй, будет сказать, что GTK+ очень отличается от Qt по своим возможностям и назначению, поэтому и устроена совершенно иначе. Однако, вот они, минусы. Основной заключается в том, что для платформ, в которые она не встроена (например, для той же Win32, которая так и напрашивается в качестве примера), библиотека занимает довольно много места и использует не только родной графический интерфейс этих платформ, но и собственные элементы управления. Собственно говоря, для большой программы - а кросс-платформенными бывают обычно именно большие программы - это не слишком весомые недостатки. Тем не менее, можно избежать даже и такой малости, если использовать библиотеку wxWidgets. Честно говоря, после нескольких месяцев работы с ней я готов признать, что это просто замечательная библиотека (особенно если сравнивать её со многими другими open-source библиотеками).

Найти библиотеку, название которой вы видите в заголовке этой статьи, можно по адресу www.wxwidgets.org. Скачать оттуда можно разные её варианты, там же можно найти при желании и ссылки на среды разработки, ориентированные на неё. Следует отметить, что, хотя изначально библиотека была написана на C++, и, соответственно, могла использоваться приложениями, написанными только на этом языке, уже появилась её модификация для .NET Framework, который, как известно, отличается своей многоязычностью в плане языков программирования. Однако пожалуй, всё же при использовании её в связке с C++ преимуществ гораздо больше. Об этом свидетельствует хотя бы тот факт, что большинство приложений, созданных с помощью wxWidgets (а внушительный, но далеко не полный их список можно найти на официальном сайте проекта), написаны на C++. Кстати, внешний вид одного из них - Watchout 'a (www.dataton.com/watchout), системы для создания интерактивных презентаций, - показан на скриншоте к статье.

Итак, какие возможности может предложить программисту wxWidgets, и какие преимущества, кроме бесплатности, есть у этой библиотеки? Возможностей много. Во-первых, это достаточно большое количество поддерживаемых платформ. Win32, WinCE, OS/2, MacOS, Linux и другие UNIX-подобные платформы с установленными GTK+, X11 или Motif. Конечно, можно сказать, что использование wxWidgets в качестве обёртки над GTK+ для UNIX-платформ не слишком рационально: оно замедляет работу приложения и добавляет дополнительные килобайты кода. Однако не нужно забывать, что под теми платформами, где GTK+ не является стандартом графического API, его runtime-библиотеки будут "весить" намного больше, чем wxWidgets на UNIX-платформах. Можно, конечно, поступить и так: написать под Linux и компанию графический интерфейс с использованием "чистого" GTK+, а для остальных систем использовать для этих целей wxWidgets. Но тогда пропадает весь смысл использования кросс-платформенной GUI библиотеки.

Итак, для создания приложения для разных платформ достаточно один раз написать код, а потом просто перекомпилировать их для каждой платформы отдельно. При этом стоит отметить не просто хорошую, а великолепную совместимость библиотеки с большинством широко распространённых компиляторов C++. Среди них как бесплатные, так и коммерческие: GNU C++ (в том числе Cygwin и MinGW под Windows), Visual C++, Borland C++, Open Watcom C++ (причём для трёх последних поддерживаются и 16-битные версии компиляторов), Digital Mars Compiler, SDCC... Этот список велик, и к нему, как понимаете, относятся не только Windows-компиляторы. Так что можно продолжать пользоваться своим любимым компилятором, используя при этом и wxWidgets.

Классов для создания пользовательского интерфейса в wxWidgets довольно много, и каждый из них основывается на родном API платформ. Особенно если учитывать их кросс-платформенность. Среди основных (базовых) классов - графические и текстовые кнопки, текстовые поля, списки и комбо-списки, "птички" (checkboxes) и прочие нужные в каждой программе с графическим интерфейсом элементы управления. Среди элементов, которые авторы библиотеки называют продвинутыми, присутствуют древовидный список, список со значками (listbox), страницы с закладками (tabbed notebook); элементы для организации многодокументного интерфейса (MDI), которые используются для платформ, отличных от Windows. Также есть полоска индикации прогресса, панель инструментов, область с прокруткой (scrollbox), таблица... Это не полный список, и есть возможность при необходимости добавить свои. В общем, как видите, элементов управления достаточно много (в принципе, сравнимо с их количеством в библиотеке MFC, или даже Windows Forms из .NET Framework). Что особо приятно, есть элемент для отображения HTML, не зависящий ни от какого браузера.

Классы, содержащиеся в wxWidgets, это не только элементы управления. Существуют специальные классы, отвечающие за правильное масштабирование элементов интерфейса (sizers), рисования с помощью "кисти" и "карандаша" на поверхности окна (в принципе, это похоже на классы GDI+, только, опять-таки, кросс-платформенные); классы для шрифтов, воспроизведения аудио и видео. Все классы библиотеки, так или иначе связанные с отображением текста, поддерживают работу с кодировкой Unicode. Это очень полезно для создания приложения на языках, отличных от английского.

Библиотека wxWidgets имеет встроенные инструменты для печати, работы с сокетами, файлами и потоками данных, в т.ч. и сжатыми по алгоритму сжатия ZIP-архивов. Имеется поддержка многопоточных приложений, присутствуют классы для интеграции приложения со справочной системой. Ко всем этим достоинствам, библиотека имеет в своём арсенале ещё и средства для работы с изображениями: их можно загружать, редактировать, рисовать и записывать на диск. Также есть класс-таймер, класс для ведения журнала ошибок, присутствует поддержка механизма drag-and-drop и буфера обмена. Что самое интересное, для Windows и UNIX-платформ есть даже классы, организующие доступ к данным через Open Database Connectivity (ODBC). Кстати, о базах данных. Если вам не нравится ODBC, то разработчики wxWidgets рекомендуют использовать Xbase (linux.techass.com/projects/xdb) - свободный клон СУБД dBase, или SQLite (www.sqlite.org), лёгкий и простой движок базы данных.

Библиотека предоставляет пользователям классы для работы с OpenGL, кросс-платформенной библиотекой для работы с быстрой графикой (в основном, трёхмерной). Таким образом, с помощью wxWidgets можно создавать кросс-платформенные игры или программы для трёхмерного моделирования. Для интеграции библиотеки с инструментами CASE существуют специальные сторонние средства, которые могут существенно упростить и ускорить разработку приложений с использованием этой библиотеки. Для Windows-приложений в библиотеке имеются средства поддержки технологий OLE и ActiveX, которые позволяют легко совместить эти специфичные для Windows технологии с кросс-платформенным API самой библиотеки.

Пользователям MFC не может не понравиться присутствие знакомой архитектуры "документ-представление". Да и вообще, способ создания приложений с использованием wxWidgets больше напоминает аналогичный для MFC, чем для какой-либо другой знакомой мне библиотеки для создания пользовательского интерфейса. В общем-то, это довольно естественно, поскольку, как написано на официальном сайте библиотеки, задумывалась она именно как кросс-платформенный аналог Microsoft Foundation Classes. Поэтому специалисты, знакомые с MFC не понаслышке, смогут достаточно просто перейти к wxWidgets.

Документация к wxWidgets могла бы служить эталоном для множества других open-source проектов. Впрочем, как это часто бывает, она не везде полная, поэтому очень полезно, что сообщество программистов, использующих wxWidgets, довольно велико, и на форумах можно найти ответы на большинство вероятно возникнущих вопросов. Есть даже полноценная книга, посвящённая программированию с помощью этой библиотеки, но пока она, к сожалению, существует только на английском языке.

Думаю, приятным моментом для разработчиков окажется и наличие изрядного количества сред разработки, позволяющих создавать wxWidgets-приложения в режиме визуального дизайнера. Самая лучшая и самая известная из таких сред - это, пожалуй, Code::Blocks Stu-dio (www.codeblocks.org). Есть и другие среды, и, надеюсь, в одном из ближайших номеров "КВ" я расскажу о них. Кроме этого, есть дополнения к другим коммерческим и бесплатным средам разработки (Borland C++ Builder, Microsoft Visual C++, Bloodshed Dev-C++), позволяющие осуществлять визуальную разработку приложений, основанных на библиотеке wxWidgets, в этих, более привычных большинству разработчиков, средах программирования. Полный список и ссылки на эти дополнения, как и на бесплатные IDE, "заточенные" под wxWidgets, можно найти на сайте www.wxcommunity.com.

Последний штрих к теме. По словам разработчиков wxWidgets, их библиотекой пользуются такие компании, как AOL, AMD, Lockheed Martin, Xerox, NASA, а также фонд Open Source Applications Foundation (OSAF). Думаю, если вас не впечатлил весь мой предыдущий рассказ, то уж этот факт должен заставить призадуматься.

Вот такая хорошая и со всех сторон полезная библиотека, о существовании которой полезно знать каждому программисту. А тем, кто задумал писать кросс-платформенное приложение на C++, стоит обратить на неё особое внимание.

(Продолжение следует)

Вадим СТАНКЕВИЧ

Версия для печатиВерсия для печати

Номер: 

42 за 2006 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя dvska
Жаль, что ни слова о wxPython.

wxPython = Python bindings to the wxWindows cross-platform toolkit.

http://www.wxpython.org

Download - http://www.wxpython.org/download.php

Online wxDocs - http://www.wxpython.org/onlinedocs.php

Screen shots - http://www.wxpython.org/screenshots.php

Introduction - http://www.wxpython.org/what.php

http://wiki.wxpython.org/ - Wiki