Создание кросс-платформенных GUI-приложений с использованием wxWidgetsИсточник: IBM developerWorks Россия Ноэл Рэппин, старший инженер-программист, Motorola, Inc.
Набор инструментальных средств wxWidgets содержит мощные кросс-платформенные средства разработки графического пользовательского интерфейса (GUI). Не только "родной" C++, но и другие языки программирования предлагают средства для использования данного инструментального набора. Узнайте, как использовать wxWidgets для создания элегантных и очень полезных GUI-приложений на предпочитаемом вами языке программирования. Почему нужно использовать wxWidgets? Потому что вы хотите быстро и просто написать GUI-приложение, которое работает на разных платформах. Вы также хотите использовать предпочитаемый вами язык программирования и желаете, чтобы ваш GUI выглядел так же хорошо, как GUI на следующем рисунке: Рисунок 1. Почтовый клиент Chandler На рисунке 1 показана программа Chandler, предназначенная для управления электронной почтой и календарем и разрабатываемая организацией Open Source Application Foundation. Она пишется с использованием инструментального набора wxWidgets. Хотя оригинальная версия wxWidgets реализована на C++, создатели Chandler используют Python с набором инструментальных средств wxPython, выступающим в качестве "оболочки", позволяющей Python-коду взаимодействовать с библиотекой C++. wxWidgets использует, по возможности, "родные" объекты; эти объекты дополняются (там, где необходимо) мощными пользовательскими виджетами. Вы можете написать wxWidgets-программу, которая будет работать на широком многообразии платформ, а также можете использовать различные языки программирования для этого. Начало работы с wxWidgetsВ данной статье я предполагаю, что вы уже посетили домашнюю страницу wxWidgets и загрузили нужный пакет для вашей платформы. Я также предполагаю, что вы выполнили на вашем компьютере команды или настройки по интеграции библиотеки wxWidgets с выбранным вами компилятором или интегрированной средой разработки (integrated development environment - IDE). После всего этого вы можете приступить к кодированию. Основными компонентами wxWidgets-программы являются два главных объекта: объект-приложение и объект-фрейм. Вы, конечно же, можете иметь более одного фрейма. Кроме того, в вашем коде вам понадобится разместить несколько wxWidgets-макросов. Рассмотрим, как скомпоновать эти части. Ссылка на библиотеку wxWidgetsЧтобы ссылаться на библиотеку wxWidgets, вы должны включить ее в код. Поместите следующую строку в верхней части ваших заголовочных (header) файлов:
Заголовочный файл wx/wx.h содержит все wxWidgets-определения, которые вам могут понадобиться. Если вы очень беспокоитесь о производительности, можете заменить этот файл операторами Определение класса приложенияДалее вы должны определить класс приложения. В большинстве простых случаев этот класс делает не так уж много, но у вас он должен быть. wxWidgets-приложение наследуется из класса
Функция После определения класса приложения поместите куда-нибудь в ваш код следующий макрос:
Вы должны заменить Определение класса фреймаТеперь определите класс фрейма, который будет представлять главное окно вашего приложения. Родительским классом wxWidgets является Листинг 1. Пример класса wxFrame
Рассмотрим имена, которые вам могут быть не знакомы. Определение таблицы событийДля реального реагирования на события вы должны определить таблицу событий внутри ваших файлов. Это еще один макрос, и он (в нашем случае) выглядит так, как показано в листинге 2. Листинг 2. Макрос таблицы событий
Макрос Инструментальный набор wxWidgets имеет несколько различных макросов событий, каждый из которых соответствует различным типам событий. В данном случае Определение ваших методовТеперь наступило время начать определять некоторые методы. Я показываю три простых метода, начиная с метода
Первые две строки метода делают то, что вы и ожидали бы при старте GUI-программы - они создают и показывают главное окно. Однако третья строка, на самом деле, является самой важной для приложения. Возврат значения
Листинг 4. Добавление кнопки в ваш фрейм
Перед добавлением кнопки во фрейм вы создаете калибратор (
Вам не нужно явно добавлять кнопку во фрейм; достаточно указания фрейма в качестве родительского контейнера. Однако, вы должны явно добавить кнопку в калибратор, для того чтобы алгоритм схемы размещения калибратора знал о ней. Это делается в последней строке метода, но не перед добавлением пустой области размером 50 x 50 пикселей в начале строки. При добавлении кнопки вы указываете также калибратору окружить кнопку границей толщиной в 50 пикселей. Это делается путем использования флага Определение обработчика событийНаконец, вы определяете простой обработчик событий, показанный в листинге 5. Листинг 5. Простой обработчик событий
Более простого приложения вы сделать не сможете. Откомпилируйте его и увидите симпатичное окно с одной кнопкой, показанное на рисунке 2. Нажмите кнопку, окно закроется. В wxWidgets закрытие последнего родительского фрейма вызывает выход из приложения, поэтому нажатие на кнопку вызывает завершение работы приложения. Рисунок 2. Демонстрационное окно Данный пример, естественно, только поверхностно затрагивает возможности wxWidgets. wxPythonХотя wxWidgets является мощным набором инструментальных средств, не каждый захочет иметь дело с деструкторами C++, управлением памятью и всем остальным. К счастью, группа талантливых программистов создала интерфейсную оболочку для библиотеки wxWidgets, которую можно использовать из других языков программирования. Поэтому, даже если C++ не является вашим любимым средством программирования, вы все равно можете воспользоваться преимуществами библиотеки wxWidgets. Самой зрелой и полностью разработанной интерфейсной оболочкой wxWidgets является wxPython, при помощи которой вы можете создавать wxWidgets-программы, используя язык программирования Python. Загружаемые пакеты существуют для платформ Microsoft Windows, Mac и Linux, а также имеется довольно большое и активное сообщество пользователей. Как все это выглядит? Python-программа, показанная в листинге 6, создает точно такое же пустое окно, которое вы создали ранее на C++. Листинг 6. Python-приложение, отображающее пустое окно
Как вы можете видеть, в этой программе существует практически однозначное соответствие между API-вызовами на C++ и wxPython-вызовами. В обоих случаях вы создаете объект приложения и объект фрейма. Вы также начинаете с метода Самым большим отличием в данном конкретном примере является связывание событий с обработчиками. Там, где C++-версия выполняет это связывание при помощи макросов таблицы событий, Python-версия использует метод Преимущества wxPython перед C++ wxWidgets начинают проявляться в больших или более сложных программах. Если не отвлекаться на дебаты об относительных преимуществах C++ и Python как языков программирования, существуют некоторые отличные функциональнее возможности, присущие wxPython-версии, которые могут быть привлекательны для вас. Механизм обработки событий с использованием методов wxEverythingElsePython - это не единственный язык программирования, имеющий средства доступа к библиотеке wxWidgets. Хотя wxPython является самым зрелым пакетом, стоит оценить и другие пакеты, если вы предпочитаете работать с конкретным языком программирования. Давайте кратко рассмотрим некоторые другие пакеты из wxWorld. Обратите внимание, пожалуйста, на то, что оценка стабильности и функциональности этих проектов зависит от доступных материалов. Многие из этих проектов являются результатом труда одного или двух программистов. Если вас интересует проект для конкретного языка, проверяйте его самостоятельно. wxPerlПоследняя основная версия wxPerl вышла в июне 2006. Предоставляются ежедневные копии, но доступная документация устарела на несколько лет. Активность списка рассылки составляет 2-3 сообщения в день. Бинарные загрузочные файлы доступны для Win32, Linux и Mac OS X. Кроме основного набора инструментальных средств доступно также несколько дополнительных наборов, включая OpenGL-оболочку и упаковщик для создания приложений Mac OS X. Главной задачей в wxPerl является преобразование wxWidgets API в уникальную Perl-разновидность объектно-ориентированного программирования (OOP). Показанный в листинге 7 фрагмент создает фрейм, аналогичный рассмотренному выше примеру. Листинг 7. Пример окна в wxPerl
Этот код является, в сущности, построчным переводом исходного кода с C++ и Python, который вы уже видели. В данном случае библиотека wxWidgets поставляется в виде Perl-пакета, а также используется вызов функции wxRubyПроект wxRuby находится в несколько не простом состоянии. Существует сырая программа, в которой связывание с wxWidgets API осуществляется вручную. Последняя версия этой программы была выпущена в ноябре 2004, и с этого времени продолжалась (с перерывами) разработка версии, которая использует более мощную программу Simplified Wrapper and Interface Generator (SWIG) для генерирования связей между Ruby и wxWidgets. Новая версия была недавно описана в списке рассылки как почти готовая: "Через пару дней…, или, возможно, в течение нескольких месяцев". Одним интересным моментом относительно wxRuby является то, что в отличие от большинства других wxWidgets-оболочек у разработчиков есть возможность подгонять имена API-вызовов wxWidgets, для большего соответствуя соглашению о наименованиях в Ruby (например, lower_case_with_underscores вместо wxWidgets UpperCaseWithCamelCase ). То есть, в то время как весь приведенный выше код примеров использовал функцию Мир wxWidgetsДругие порты wxWidgets находятся на разных стадиях завершенности или незавершенности. Ниже представлен краткий экскурс в область wxWidgets:
РезюмеМир wxWidgets может много чего предложить программистам всех мастей. Базовый набор программ является гибким и может удовлетворить большинство ваших GUI-потребностей. Различные пакеты для связывания позволяют wxWidgets находиться в пределах досягаемости для большинства программистов. Использование инструментального набора wxWidgets с предпочитаемым языком программирования поможет вам создать отлично выглядящие интерфейсы для ваших собственных приложений. |