Руководства, Инструкции, Бланки

Wxformbuilder руководство img-1

Wxformbuilder руководство

Рейтинг: 4.4/5.0 (1837 проголосовавших)

Категория: Руководства

Описание

Не устанавливается WXWIDGETS для CodeBlocks - Stack Overflow на русском

Так установка wxwidgets с конкретной IDE мало связана, во всяком случае на этом этапе. А вообще насколько принципиально использовать именно mingw? В C::B ведь можно указать любой компилятор. Когда развлекался с wx под Windows, помнится, вообще ваткомом собирал, просто подключая в проект их *.lib. – user6550 22 апр '15 в 10:47

Судя по ошибкам компиляции проблема в том, что компилятор не находит стандартные заголовочные файлы, находящиеся в папке include.

1) Нужно убедиться, что путь до каталога установки MinGW не содержит пробелов и русских символов.

2) Задать переменные окружения CPLUS_INCLUDE_PATH и LIBRARY_PATH. К примеру если каталог установки C:\mingw, то CPLUS_INCLUDE_PATH должна содержать значение C:\mingw\include, а LIBRARY_PATH значение C:\mingw\lib.

3) Перезагрузить компьютер после установки переменных окружения.

ответ дан 29 апр '15 в 18:39

не помогло! задавал переменные, даже ставил компилятор отдельно от codeblocks, не пашет пишет ту же ошибку! Компьютер перезагружал – MaximPro 22 ноя '15 в 17:22

Ваш ответ

2016 Stack Exchange, Inc

Другие статьи

WxWidgets IT рабочие заметки

IT рабочие заметки wxWidgets Преимущества wxWidgets

Особенность, которая отличает wxWidgets от многих других фреймворков, таких как MFC и OWL, — это многоплатформенная природа. wxWidgets имеет API. который одинаков или почти одинаков на всех поддерживаемых платформах. Это означает, что вы можете написать приложение, к примеру, под Windows и затем с очень немногими (если они вообще понадобятся) изменениями перекомпилировать его под Linux или Mac OS X. Это дает огромное преимущество по сравнению с раздельным программированием под каждую платформу: вам не придется изучать специализированный API для каждой платформы. Кроме того, при выпуске новых версий операционных систем и версий wxWidgets уже написанные приложения всегда будут выглядеть актуально и использовать последние графические версии элементов управления.

wxWidgets использует графические элементы интерфейса операционной системы. Многие фреймворки такие как Swing и Qt используют собственные графические элементы управления, снабжая их сменяемыми темами для каждой платформы. Напротив, wxWidgets использует родные графические элементы пользовательского интерфейса всюду где это возможно. В результате они не только выглядят как родные для операционной системы — они на самом деле родные. Это очень важно для пользователей, привыкших работать в конкретной среде, поскольку любое, даже самое незначительное, изменение интерфейса сказывается на их способности свободно использовать свой опыт управления в стиле стандарта их ОС. Вместо этого wxWidgets предоставляет тонкую абстракцию к существующим компонентам системы.

wxWidgets использует C++. Почему не Java? Java отлично подходит для web-приложений, но не является удачным выбором для десктопа. Прежде всего, C++ приложения, работающие с wxWidgets быстрее, имеют более естественный вид. Они проще в установке, поскольку не требуется специальная виртуальная машина. C++, к тому же, предоставляет простой доступ к низкоуровневой функциональности, и написанный код может быть легко интегрирован с уже имеющимся C/C++ кодом.

wxWidgets — бесплатная свободная платформа. Это важный психологический и стратегический момент. Создавая исходный код с использованием бесплатных свободных библиотек, всегда можно решить свои задачи редактируя исходный код; это гораздо практичнее, чем отправлять запрос на требуемую функциональность производителю библиотеки и дожидаться обновления.

Многие аспекты создания приложений, которые иначе пришлось бы решать самостоятельно, в wxWidgets уже инкапсулированы в готовые к применению классы. wxWidgets имеет широкий спектр пользователей — от программистов энтузиастов до крупных корпораций, от отделов научного программирования до медицинских исследовательских групп, от экологических исследователей до телекоммуникационной индустрии.

Ссылки wxWidgets WxDev-C++ wxFormBuilder Code::Blocks

Wxformbuilder руководство

С++ - wxFormBuilder

Похоже, что фреймворк wxWidgets неплохо будоражит умы разработчиков, раз для него и не без его помощи четверо парней разработали автономный кроссплатформенный GUI -редактор wxFormBuilder (далее – «ФормБилдер»). О нём можно почитать на сайте wxformbuilder.org. Этим GUI -редактором можно создавать разнообразные формы с красивыми контролами, генерировать для них классы на языке C++ и XRC-коды, но, к сожалению, не более. В нём даже нельзя редактировать полученные коды. Для комфортной компиляции и отладки приложения нужна какая-то IDE. Однако, как связать «ФормБилдер» с IDE. Вразумительных ответов в Интернете я не нашёл. Даже сами разработчики «ФормБилдера» советуют просто вставлять сгенерированный код «куда-нибудь». Недостатки такой рекомендации очевидны: ошибки и плохая синхронизация между средами. Рекомендация, видимо, объясняется тем, что «ФормБилдер» в упор не видит никакой IDE из имеющихся на компьютере. Возможно, этот недостаток в дальнейшем и будет устранён, а пока что разработчики Code::Blocks (далее по-прежнему – СиБи) предложили своё решение. И довольно оригинальное.

Устанавливаем «ФормБилдер» и библиотеки
Устанавливается «ФормБилдер» просто: подключаемся к Интернету и из терминала командуем: sudo apt-get install wxformbuilder. После загрузки-установки пакета идём в меню «Линукса» Приложения > Программирование и мышкой вытягиваем появившуюся иконку wxFB на рабочий стол. Но не спешите запускать этот GUI -редактор и начинать работать – ничего путного не выйдет: «ФормБилдер» работает с монолитной библиотекой виджетов. Придётся «по-взрослому» скомпилировать нужную библиотеку, причём для нужного интерфейсного порта «Линукса» – GTK2 или X11. Выбираем GTK2, получится универсальнее, красивее и будут учтены темы рабочего стола; поэтому устанавливаем вспомогательный пакет libgtk2.0-dev: вставляем в DVD-привод дистрибутив Ubuntu 8.10. подключаемся к Интернету и командуем: sudo apt-get install libgtk2.0-dev. Стало? Тогда можно устанавливать библиотеку виджетов. Идём на сайт wxwidgets.org и выкачиваем архив wxGTK-2.8.9.tar.gz. Распаковываем архив, в результате образуется поддиректория wxGTK-2.8.9. Переходим в неё. Под рутом или суперпользователем конфигурируем компиляцию командой ./configure –enable-monolithic. компилируем, как обычно, и командуем: ldconfig. Посмотреть, куда и какая установилась библиотека виджетов, можно командой wx-config –libs. В норме получаем нечто подобное: -L/usr/local/lib -pthread -lwx_gtk2-2.8. Перезагружаемся.

Связываем «ФормБилдер» и СиБи
Создадим в СиБи новый RAD-проект и в ответ на вопрос, какой GUI -редактор использовать, предпочтём использовать wxFormBuilder. После этого запустить встраиваемый GUI -редактор уже не удастся, так как при выборе внешнего встраиваемый отключается. Но не ищите, как запустить и внешний GUI -редактор. Фишка в том, что его не надо запускать! СиБи, помимо проекта «для себя», одновременно создаёт проект и для «ФормБилдера». Чтобы в этом убедиться, в «сибишном» окне Management на вкладке Projects идём Workspace > myfb > Others и видим файл wxWizFrame.fbp. Его просто надо открыть «ФормБилдером». Для этого на соседнем свободном рабочем столе (завидуйте, пользователи «Windows»!) запускаем «ФормБилдер», из его главного меню командуем File > Open. восходим к файлу wxWizFrame.fbp и дважды кликаем по нему, чем запускаем созданный из СиБи проект для «ФормБилдера» в виде формы с меню и статусбаром.

Проверим связь между «ФормБилдером» и СиБи. Находясь в «ФормБилдере», жмём Ctrl+S, сохраняя проект, затем жмём F8, чтобы сгенерировать файлы с кодами. Будут сгенерированы файлы GuiFrame.cpp и GuiFrame.h, которые являются общими для СиБи и «Формбилдера». Вот она, связь-то. Переключаемся на СиБи сменой рабочего стола, пересобираем и запускаем приложение. Если появилось окно приложения с куцым меню и пустым статусбаром, то всё нормально. Закрываем это окно.
Чтобы начать с чистой формы, удалим меню и статусбар. Для этого возвращаемся на рабочий стол с «ФормБилдером» и щёлкаем правой кнопкой мыши на дереве объектов Object Tree по ненужным элементам, каждый раз нажимая Delete.
Рисуем? Нет, строим!
Различия между встраиваемым GUI -редактором и «Форм-Билдером» в части инструментария не очень большие. Основное отличие – по-другому устроена панель быстрого управления и, кроме того, она вынесена в главную панель инструментов (рис. 1).

Рис. 1
На ней нет спина, регулирующего ширину бордюров элементов, этим свойством придётся управлять из инспектора объектов. Также нет кнопки просмотра XML-образа формы, вместо неё надо жать F5. Всё остальное есть с, в общем-то, небольшими отличиями. Сюрпризы будут при проектировании формы.
Идея тестового приложения прежняя: пользователь вводит текст в строку, жмёт кнопку, и текст добавляется в список, а строка очищается. Требования тоже прежние: изменения размеров окна приложения изменяют длину строки по горизонтали, список изменяют по обеим осям, кнопку изменения не затрагивают.

Итак, окно Editor на вкладке Designer содержит пустую форму. «Матерьялу» для начинки формы потребуется ровно столько же, как и в случае со встраиваемым GUI-редактором: пара сайзеров, строка, кнопка и список. Но в «ФормБилдере» проектирование интерфейса действительно больше похоже на строительство, чем на рисование: при щелчке по палитре элементы сразу попадают на форму без каких-либо перетаскиваний или дополнительных пассов, при этом внутри сайзеров элементы выстраиваются сверху-вниз или справа-налево в порядке поступления, причём поменять местами элементы внутри сайзера нельзя. Ошиблись – разбираем, то бишь стираем и строим заново. В этом и заключаются все сюрпризы. Впрочем, можно привыкнуть. Не трогая форму, щёлкаем на палитре: wxStaticBoxSizer, wxListBox, wxStaticBoxSizer, wxTextCtrl, wxButton. Выстроилось дерево объектов Object Tree (рис. 2).

Рис. 2
Щёлкаем на дереве образ второго сайзера и в инспекторе объектов меняем ориентацию на горизонтальную.
Далее настраиваем элементы, манипулируя их свойствами так, как это делалось для встраиваемого GUI -редактора в предыдущей статье. Главное – помнить, что в пределах сайзера для разрыва межэлементной размерной связи свойство Proportion одного из элементов следует сбрасывать в ноль. В отличие от встраиваемого GUI -редактора, «ФормБилдер» оставляет сайзеры видимыми, но так как инспектор объектов позволяет ставить на сайзеры лейблы, то это даже удобно. Сохраняемся, генерируем код, переключаемся с «ФормБилдера» на СиБи. Последний тревожно сообщает, что в файле GUIFrame.cpp произошли изменения, и спрашивает, не перезагрузить ли его. Жмём Yes, пересобираем и запускаем приложение. Кнопка в приложении, естественно, не работает. Закрываем приложение.
Возвращаемся в «ФормБилдер», на дереве объектов щёлкаем образ нашей кнопки, в инспекторе объектов вписываем в пустую строку обработчика события OnButtonClick какое-нибудь имя этого обработчика, например, AddStr. Сохраняемся, генерируем код и переключаемся в СиБи. Он опять просит разрешить перезагрузить файл GUIFrame.cpp, соглашаемся. В файле GUIFrame.cpp обнаруживаем, что в конструктор и деструктор формы добавились, соответственно, коннектор и дисконнектор обработчика AddStr, а в файл GUIFrame.h вставился новый член класса GUIFrame – обработчик события нажатия кнопки:

Вписываем между фигурными скобками процедуру обработки, аналогичную рассмотренной для встраиваемого GUI -редактора в прошлой статье, компилируем, запускаем и тестируем приложение. Закрываем приложение и не забываем сохранить «сибишный» проект. Исполняемый файл получается на 10-20% меньше, чем при использовании встраиваемого GUI -редактора.
Выводы
Недостатки, по сравнению со встраиваемым GUI -редактором: беднее палитра виджетов (например, нет диаграмм) и «строительство» формы меньше соответствует концепции RAD, чем рисование.

Достоинства: меньшие исполняемые файлы, разделение труда в команде («ФормБилдер» и СиБи могут находиться на разных машинах с разными ОС) плюс относительная простота пополнения палитры новыми виджетами. Правда, как это делается, в данной статье не рассматривалось, я и так вас, вероятно, утомил.
Каким же GUI -редактором пользоваться? В команде, думается, «ФормБилдер» предпочтительнее. А в одиночку – как пожелаете, но с «ФормБилдером» экран всё же свободнее.

Qt vs wxWidgets

Qt vs wxWidgets [new]

Откуда:
Сообщений: 11594

У меня есть некоторый опыт с Qt (примерно пару лет на небольших проектах) и совсем нету опыта с wxWidgets (только вчера выкачал ее). Ну соотвественно вопрос: кто-нибудь пробовал жить на обоих этих библиотеках? И ради каких плюсов была выбрана та или другая?
Я начал отворачиваться от Qt из-за ее лицензии - особенно меня нервирует их запрет мигрировать проект с open source версии библиотеки на commersial версию. "You must purchase a Qt Commercial License from Trolltech or from any of its authorized resellers before you start developing proprietary software. The Commercial license does not allow the incorporation of code developed with the Open Source Edition of Qt into a proprietary product. " Странный запрет на мой взгляд, но увы.

А вот с технической точки зрения чего из Qt вам не хватает в wxWidgets и наоборот?

Начнем еще одну священую войну. )

Re: Qt vs wxWidgets [new]

Откуда: СПб --> Dortmund
Сообщений: 5701

тоже очень заинтересован в результатах опроса

Re: Qt vs wxWidgets [new]

Откуда:
Сообщений: 564

Не работал ни с одной их них.
Но слышал, что в QT есть дизайнер и пр. инструменты. Знатоки, есть бесплатный дизайнер в wxWidgets.

Откуда: с Шахтов
Сообщений: 770

Вот это я и имел ввиду - БД значит. Предусмотрена работа с ODBC (есть расширения библы для работы с другими серверами от сторонних авторов врать не буду пробовал только FireBird - очень урезан функционал).
ODBC - писанины в 3 раза больше чем Qt. Описывать нужно каждый столбец который ты получишь из запроса.
Через ole внятно работать можно только с Excel (как работать с OpenOffice я так и не понял).
Отчеты - Prevew есть от стороннего производителя вроде ничего (я до него не добрался).
*nix работает на Gtk - некоторым не нравиться этот факт.
И главное Доки не хватает, книг нет, русскоязычного комунити - нет (очень слабо у нас не популярно).

Помоему лутше смириться с Qt OpenSource Edition.

Есть еще вариант если не нужна кросплатформенность. Borland Turbo C++ 2006 - есть OpenSource лицензия - но при этом урезан функционал - нет генераторов отчетов, нельзя подключать соронние компоненты (но можно подключить их динамически). А так весь стандартный набор есть - BDE, ADO, dbExpress, DBGrid, StringGrid, ClientDataSet

> Заниматься Qt есть смысл только если собираешься писать программы, которые
> будешь распространять по GPL.
Или если есть деньги на лицензию, или если софт будет писаться на заказ, но
не для массовой продажи.

Posted via ActualForum NNTP Server 1.4

Откуда: с Шахтов
Сообщений: 770

Начну с третий позиции:
3. Ничего править не нужно FormBuilder создает уже готовый класс с которым ты будешь работать из твоей любимой IDE вот пример

1. Можно подумать без сайзера в wxWidgets c диалогами можно нормально работать.
2. Можно! (Если я тебя понял). На эвент цепляешь функцию она виртуальная, потом когда в IDE работаешь с этим классом переписываешь ее.

Примеры использования wxWidgets

Как и обещал, пишу продолжение своей заметки про wxWidgets. В этом посте будет описана установка wxWidgets и Code::Blocks под различными операционными системами, основы создания GUI с помощью wxSmith, а также приведены небольшие примеры кода.

1. Установка wxWidgets и Code::Blocks

Поскольку мы имеем дело с кроссплатформенной разработкой, тут все зависит от используемой нами ОС. Под Windows нужно скачать wxPack и компилятор MinGW отсюда. последнюю версию Code::Blocks без MinGW отсюда и утилиту wx-config.exe отсюда. Устанавливаем wxPack, затем MinGW, затем Code::Blocks. Утилиту wx-config.exe копируем в «C:\Windows\» или где там у вас стоит Винда.

Дополнение: Как выяснилось, можно поставить и более свежую версию MinGW, скажем, если вы хотите использовать в своем проекте возможности C++0x. Даже wxPack не нужен, достаточно поставить пакет wxMSW отсюда. Только учтите, что кое-где в wxWidgets используются расширения GCC, не входящие в стандарт C++0x. поэтому в Project → Build Options → Compiler Settings → Other Options нужно дописать флаг -std=gnu++0x. Флаг -std=c++0x. который Code::Blocks позволяет выставить с помощью галочки в соседней вкладке Compiler Flags, не годится.

В Ubuntu/Debian установка происходит следующим образом:

sudo apt-get install codeblocks codeblocks-contrib g++
# на счет libwxgtk2.6-dev есть сомнения, попробуйте сначала без него
sudo apt-get install wx2.8-headers libwxgtk2.8- 0 \
libwxgtk2.8-dev libwxgtk2.6-dev
sudo ln -s / usr / include / wx- 2.8 / wx / usr / include / wx
# если файла /usr/include/wx/setup.h нет, тогда говорим
sudo ln -s / usr / include / wx- 2.6 / wx / deprecated / setup.h \
/ usr / include / wx / setup.h

wx-config --cxxflags
wx-config --libs

Установка во FreeBSD намного проще. ибо все зависимости тянутся автоматом:

pkg_add -r codeblocks

Запускаем IDE, идем в меню «Settings → Compiler and debugger…». В «Compiler Sittings → Other Options» пишем:

` wxgtk2u- 2.8 -config --cppflags `

В «Linker Settings → Other linker options» прописываем:

` wxgtk2u- 2.8 -config --libs `

Все приведенное выше писалось по памяти и небольшой шпаргалке, сохраненной на GMail, так что в случае возникновения проблем, пожалуйста, отпишитесь в комментариях. С вероятностью 90% решение будет заключаться в прописывании правильных путей в настройках Code::Blocks или правке переменных окружения.

При портировании проекта из *nix в Windows, нужно убедиться, что в «Project → Build Options → Compiler/Linker Settings» wx-config вызывается с параметром --static=yes.

Дополнение: Есть сведения. что в репозитории Ubuntu лежит устаревшая и содержащая ошибки версия Code::Blocks, в связи с чем рекомендуется использовать ночные сборки или компилировать Code::Blocks из исходников. Подробности можно найти здесь .

2. Создание графического интерфейса

В комплекте с Code::Blocks идет плагин wxSmith, предназначенный для редактирования GUI. Увидеть его можно, открыв в окне Management (слева) вкладку Resources. Плагин не сильно похож на редактор GUI в Borland Delphi, но разобраться в нем просто.

Для меня самым сложным было понять, что в 90% случаев весь лайаут строится на основе wxBoxSizer. Для примера рассмотрим мои наброски интерфейса mp3-плеера:

Красные прямоугольники — это границы элементов wxBoxSizer. Самый большой прямоугольник имеет ориентацию wxVERTICAL. Все добавляемые в него элементы будут располагаться один под другим. Вложенные сайзеры имеют ориентацию wxHORIZONTAL. Расположенные в них элементы выстраиваются в одну строчку (см нижний ряд кнопок).

Вот как выглядит дерево элементов управления:

С помощью свойств Proportion, Shaped, Expand, Placement и Border можно добиться практически любого вообразимого расположения элементов. Настроить эти свойства можно в Quick Properties Panel (нижняя кнопка с буквой Q в правой части wxSmith). На словах довольно сложно объяснить, каким свойствам какие значения нужно присваивать для достижения определенного результата. Поэкспериментируйте немного и сами все поймете. Также рекомендую обратить внимание на пример из этой статьи .

3. Использование регулярных выражений

Наконец-то мы дошли до примеров кода. Начну с моих любимых регулярных выражений. Классическая ситуация — пользователь вводит что-то в поле ввода и нажимает кнопку «ОК». Программа должна как-то обработать введенные данные, но сначала следовало бы проверить их корректность.

// получаем имя функции (из wxTextCtrl)
wxString funcName = txtFuncName - > GetValue ( ) ;

// создаем объект "регулярное выражение"
wxRegEx reFuncName ( _T ( "^[a-z_][a-z0-9_]+$" ). wxRE_ICASE ) ;
// проверяем его валидность (только в Debug-версии)
wxASSERT ( reFuncName. IsValid ( ) ) ;

// введенные данные соответствует регулярному выражению?
if (. reFuncName. Matches ( funcName ) ) {
// выводим сообщение об ошибке
wxMessageBox ( _ ( "Invalid function name '" ) + funcName + _T ( "'!" ) ) ;
// очищаем поле ввода
txtFuncName - > Clear ( ) ;
// выходим из события OnClick
return ;
}
//.

Здесь все довольно очевидно, если не считать макросов _T() и _(). Первый используется при объявлении unicode-строк, второй — при объявлении строк, которые мы можем захотеть перевести на другой язык (см следующий пример). Тот или иной макрос нужно использовать везде, где мы хотим получить объект wxString вместо массива char. Учитывая, что мы пишем с использованием wxWidgets, это 99% случаев. Необходимость использовать макросы при объявлении каждой строки компенсируется способностью Code::Blocks подставлять парные скобки и кавычки. У макроса _T() есть синоним wxT(), но он на один символ длиннее. Просто примите к сведенью и не удивляйтесь, если увидите wxT() в чужом коде.

Еще кое-что, касающееся регулярных выражений в wxWidgets, вы найдете в пункте 5 далее по тексту.

4. Интернационализация в wxWidgets

Интернационализация (сокращенно i18n, от «internationalization») — это когда мы один раз пишем программу, после чего для перевода на другой язык нам достаточно просто снабдить ее файлами перевода. Тут главная фишка в том, что нам не требуется перекомпилировать программу для каждого языка. Традиционно перевод осуществляется с помощью программы PoEdit .

PoEdit анализирует исходный код нашей программы, выдирая из нее строки, окруженные макросом _(), который на самом деле есть вызов функции gettext(). Для каждой строки вводим перевод. Таблица строк сохраняется в файл .po (отсюда и название программы). Когда перевод закончен, файл .po нужно «скомпилировать» в формат .mo. Это и есть файл перевода.

Осталось дописать несколько строк в коде программы:

class ExampleApp. public wxApp {
public.
virtual bool OnInit ( ) ;
private.
wxLocale m_Locale ; // <-- дописали вот это
} ;

bool ExampleApp. OnInit ( ) {
//(*AppInitialize
bool wxsOK = true ;
wxInitAllImageHandlers ( ) ;
if ( wxsOK ) {
// vvv дописали вот это vvv

// добавляем каталог для поиска .mo файлов
m_Locale. AddCatalogLookupPathPrefix ( _T ( "lang" ) ) ;
// инициализация объекта
m_Locale. Init ( ) ;
// подгружаем .mo файл, соответствующий текущей локали
// (если такой файл есть)
// например, если текущая локаль - ru_RU и в каталоге ./lang
// лежит файл ru_RU.mo, он будет использован для перевода
m_Locale. AddCatalog ( m_Locale. GetCanonicalName ( ) ) ;
// для локали ru_RU аналогично вызову
// m_Locale.AddCatalog(_T("ru_RU"));

// ^^^ дописали вот это ^^^

Теперь бросаем в каталог ./lang файлы с переведенными строками, для русского языка — ru_RU.mo, для немецкого — de_DE.mo и так далее. Программа будет автоматически отображать тот язык, на котором говорит пользователь. В мире UNIX, например, этот язык определяется с помощью переменной окружения $LANG.

Также можете распространять вместе с программой и .po файл. Чисто на случай, если найдутся добровольцы, желающие перевести ее на свой родной язык. Чтобы облегчить им работу, изначально используйте английский. Вряд ли в Японии или Египте многие владеют русским языком.

5. Пример использования wxHTTP

В wxWidgets имеется много полезных классов, среди которых мне особенно хотелось бы отметить wxHTTP. Как несложно догадаться по названию, он представляет собой готовый HTTP-клиент. Пример использования:

// скачать веб-страницу (в UTF-8!) и сохранить ее в rslt
// true в случае успеха, false в случае ошибки
bool ExampleFrame. HttpGet (
const wxString url, wxString & rslt, size_t maxLen )
{
const unsigned int DEFAULT_MAX_LEN = 128 * 1024 ;
const unsigned int HTTP_TIMEOUT = 10 ;
if ( maxLen == 0 ) {
// некорректный аргумент или значение по умолчанию
maxLen = DEFAULT_MAX_LEN ;
}

// регулярное выражение для url
wxRegEx reUrl ( wxT ( "^(?:http://)?([^/]+)(/.*)$" ). wxRE_ADVANCED ) ;
wxASSERT ( reUrl. IsValid ( ) ) ;

if (. reUrl. Matches ( url ) ) {
// неверный формат URL
// возможно, не хватает слэша после доменного имени
return false ;
}

// получаем доменное имя и get-запрос
wxString server = reUrl. GetMatch ( url, 1 ) ;
wxString query = reUrl. GetMatch ( url, 2 ) ;

// создаем http-клиент
wxHTTP http ;
http. SetTimeout ( HTTP_TIMEOUT ) ;
http. SetHeader (
wxT ( "Content-type" ) ,
wxT ( "text/html; charset=utf-8" )
) ;
http. SetHeader (
wxT ( "User-Agent" ) ,
wxT ( "Mozilla/5.0 (X11; U; FreeBSD i386; ru-RU; "
"rv:1.9.2.13) Gecko/20110202 Firefox/3.6.13" )
) ;

// соединяемся с сервером
if (. http. Connect ( server ) ) {
// this->LogAdd(_("Connection failed."));
return false ;
}

// получаем поток данных
wxInputStream * searchRslt = http. GetInputStream ( query ) ;
if ( http. GetError ( ). = wxPROTO_NOERR ) {
// this->LogAdd(_("Download failed, get.GetError() == ")
// + http.GetError());
// что-то вроде if(x) < delete x; x = NULL; >
wxDELETE ( searchRslt ) ;
return false ;
}

// выделяем память для временного буфера
char * binaryData ;
try {
binaryData = new char [ maxLen ] ;
} catch ( bad_alloc & error ) {
// нехватка памяти
wxDELETE ( searchRslt ) ;
return false ;
}

// считываем данные из потока в буфер
searchRslt - > Read ( binaryData, maxLen ) ;
wxDELETE ( searchRslt ) ;

// преобразуем данные из буфера в строку
rslt = wxString. FromUTF8 ( binaryData, maxLen ) ;
// что-то вроде if(x) < delete[] x; x = NULL; >
wxDELETEA ( binaryData ) ;
return true ;
}

Обратите внимание на то, как выделяется память для временного буфера. В современном C++ в случае нехватки памяти оператор new вызывает исключение std::bad_alloc. Я вот, к примеру, очень долго этого не знал и после вызова new делал проверку в стиле if(ptr != 0) .

Из недостатков класса wxHTTP хотелось бы отметить варнинги компилятора при сборке Release-версии программы. Надеюсь, в wxWidgets 2.9 это исправят.

6. Многопоточность в wxWidgets

Рассмотрим простейший пример. Есть поток, который в цикле инкрементирует значение счетчика до тех пор, пока значение некого флага не будет установлено равным true. Когда это происходит, поток завершает работу. Доступ к флагу регулируется с помощью мьютекса. По-моему, проще некуда.

class CounterThread. public wxThread {
private.
unsigned int m_cnt ; // наш счетчик
wxMutex * m_mtx ; // мьютекс
bool * m_exitFlag ; // указатель на флаг
// закрытый метод для чтения флага
bool GetExitFlag ( ) {
bool exitFlag ;
m_mtx - > Lock ( ) ;
exitFlag = * m_exitFlag ;
m_mtx - > Unlock ( ) ;
return exitFlag ;
}
public.
CounterThread ( wxThreadKind kind = wxTHREAD_DETACHED ).
wxThread ( kind ) {
// do nothing
}
// инициализируем класс
void Create ( wxMutex * mtx, bool * exitFlag ) {
m_cnt = 0 ;
m_mtx = mtx ;
m_exitFlag = exitFlag ;
wxThread. Create ( ) ;
}
// получаем значение счетчика (ПОСЛЕ остановки потока!)
unsigned int GetCounter ( ) { return m_cnt ; }
// полезная нагрузка
virtual void * Entry ( ) {
while ( this - > GetExitFlag ( ). = true ) {
m_cnt ++ ;
}
return 0 ;
}
} ;

Теперь — как это использовать:

// ---- файл wxThreadsMain.h -----
//.
class wxThreadsFrame. public wxFrame {
public.
//.
private.
wxMutex m_Mutex ;
bool m_ExitFlag ;
CounterThread * m_CounterThreads [ 8 ] ;
//.
} ;
//.
// ---- файл wxThreadsMain.cpp ----
//.
void wxThreadsFrame. OnButton1Click ( wxCommandEvent & event ) {
// число потоков
const int ThreadsNumber =
sizeof ( m_CounterThreads ) / sizeof ( m_CounterThreads [ 0 ] ) ;
// флаг завершения работы потоков
m_ExitFlag = false ;
// создаем потоки
for ( int i = 0 ; i < ThreadsNumber ; i ++ ) {
try {
m_CounterThreads [ i ] = new CounterThread ( wxTHREAD_JOINABLE ) ;
} catch ( bad_alloc & error ) {
// не удалось создать поток из-за нехватки памяти
if ( i > 0 ) {
for ( j = 0 ; j < i ; j ++ ) {
wxDELETE ( m_CounterThreads [ j ] ) ;
}
}
wxMessageBox ( _ ( "Failed to start thread #" ) +
wxString. Format ( _T ( "%d" ). i ) ) ;
return ;
}

m_CounterThreads [ i ] - > Create ( & m_Mutex, & m_ExitFlag ) ;
}
// все потоки созданы, теперь запускаем их
for ( int i = 0 ; i < ThreadsNumber ; i ++ ) {
m_CounterThreads [ i ] - > Run ( ) ;
}
// ждем одну секунду
wxSleep ( 1 ) ;
// устанавливаем флаг выхода
m_Mutex. Lock ( ) ;
m_ExitFlag = true ;
m_Mutex. Unlock ( ) ;
// сюда будут сохранены значения счетчиков
unsigned int counters [ ThreadsNumber ] ;
// а сюда - конкатенация их младших бит
wxString randomNumber ;
// ждем завершения потоков, освобождаем память
for ( int i = 0 ; i < ThreadsNumber ; i ++ ) {
// ждем завершения
m_CounterThreads [ i ] - > Wait ( ) ;
// получаем значение счетчика
counters [ i ] = m_CounterThreads [ i ] - > GetCounter ( ) ;
// поток больше не нужен
wxDELETE ( m_CounterThreads [ i ] ) ;
// записываем в строку значение младшего бита счетчика
randomNumber + = wxString. Format ( _T ( "%d" ). counters [ i ] & 1 ) ;
}
// выводим результат
ListBox1 - > Insert ( randomNumber, 0 ) ;
}
//.

Пример может показаться несколько бессмысленным, но на самом деле это не совсем так. Значения счетчиков сильно зависят от загруженности системы. Если добавить в метод CounterThread::Entry() какие-нибудь действия с оперативной памятью (например, сортировку массива «пузырьком») и с жестким диском (чтение/запись временного файла), счетчик будет вести себя еще более непредсказуемо. А случайные числа бывают очень полезны (например, в криптографии ) и зачастую их не так уж просто получить.

Оптимальное число потоков равно числу имеющихся на борту ядер процессора, которое можно определить с помощью функции wxThread::GetCPUCount(). Предварительно следует задать достаточно большой размер массива m_CounterThreads или использовать vector.

7. Где взять дополнительную инфу?

Я продемонстрировал лишь некоторые возможности wxWidgets. За более подробной информацией обращайтесь к официальной документации и wiki .

Из русскоязычных сайтов я бы рекомендовал блог Николая Тюшкова и сайт wxWidgets.info. Первый ведет и регулярно обновляет практикующий программист, использующие в своей работе, помимо прочего, wxWidgets. Второй не обновлялся с 2009 года, но содержит множество актуальных статей по теме.

В ЖЖ было обнаружено сообщество. посвященное wxWidgets. Участников в нем немного, но некоторые из них время от времени подают признаки жизни.

Для поиска примеров кода я советую использовать koders.com. Все остальное можно найти через Google.

Если у вас есть вопросы, можете задать их мне в комментариях к этой заметке. То же самое справедливо в отношении замечаний по написанному, указаниям на неточности, дополнениям и тд.

Подпишись через RSS. E-Mail. Google+. Facebook. Vk или Twitter !

Компиляция библиотеки wxWidgets в Code

Компиляция библиотеки wxWidgets в Code::Blocks

Если вам нужна кроссплатформенная библиотека для создания интерфейса программы, то стоит в первую очередь обратить на wxWidgets или Qt. Про Qt много всего интересного написано на сайте Блог программиста. однако я обычно предпочитаю wxWidgets за чуть меньший размер dll-ок, которые необходимо при этом добавлять в программу, да и компилировать программу с ней несколько легче. С другой стороны, wxWidgets - это библиотека исключительно для построения интерфейсов, в то время как Qt - это целый фреймворк, который имеет множество дополнительных возможностей, напрямую с интерфейсом не связанные. Как видно из заголовка, эта статья будет посвящена wxWidgets.

На мой взгляд для кроссплатформенной разработки на C++ в качестве среды разработки больше всего подходит Code::Blocks. с каждой версией этой IDE пользоваться становится все легче, и все лучше она работает "из коробки". В этой статье мы рассмотрим процесс компиляции библиотеки wxWidgets в этой среде.

На странице загрузки wxWidgets можно скачать уже скомпилированные объектные файлы для этой библиотеки, но иногда нужно самому скомпилировать библиотеку, например, если требуется задать какие-то параметры компиляции или скомпилировать каким-нибудь специфическим компилятором.

В этой статье мы рассмотрим компиляцию wxWidgets с помощью компилятора mingw, который прилагается с Code::Blocks. На всякий случай напомню, что mingw - это компилятор GCC под Windows.

Компиляция библиотеки wxWidgets

0. Качаем Code::Blocks Главное скачать Code::Blocks с интегрированным mingw.

1. Устанавливаем Code::Blocks. Здесь нет ничего особенного, под Windows жмем Next -> Next -> Next. Все как обычно.

2. Установка переменной окружения PATH. Code::Blocks может использовать как сторонние компиляторы, так и интегрированный mingw (именно этот случай мы рассматриваем), который после установки будет располагаться в папке C:\Program Files (x86)\CodeBlocks\MinGW\. Чтобы было проще использовать этот компилятор, желательно добавить этот путь в переменную окружения PATH. В принципе, этого можно не делать, но тогда во многих случаях при работе с тем же компилятором из командной строки придется или указывать полный путь до компилятора, или добавлять его в ту же самую переменную при каждом сеансе работы. ИМХО, лучше установить эту переменную окружения сразу.

Для того, чтобы установить переменную окружения под Windows, нужно попасть в диалог "System Properties" (поскольку у меня англоязычная Windows, все названия я буду приводить на английском языке, думаю, что найти их русскоязычный аналог не составит труда). Этот диалог достаточно глубоко закопан, чтобы в него попасть под Windows 8.1, нажимаем правую кнопку мыши на кнопке Пуск. выбираем пункт меню System. Откроется следующее окно:

Слева выбираем пункт Advanced system settings и попадаем в диалог "System Properties". Затем на вкладке Advanced нажимаем кнопку Environment Variables

Создание кросс-платформенных GUI-приложений с использованием wxWidgets

Создание кросс-платформенных GUI-приложений с использованием wxWidgets

Почему нужно использовать 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-определения, которые вам могут понадобиться. Если вы очень беспокоитесь о производительности, можете заменить этот файл операторами include с конкретными заголовочными файлами, которые собираетесь использовать.

Определение класса приложения

Далее вы должны определить класс приложения. В большинстве простых случаев этот класс делает не так уж много, но у вас он должен быть. wxWidgets-приложение наследуется из класса wxApp. и минимальное определение выглядит так:

Функция OnInit() вызывается при запуске вашего приложения - практически, это ваш метод main() .

После определения класса приложения поместите куда-нибудь в ваш код следующий макрос:

Вы должны заменить DemoApp на имя вашего класса приложения. Этот макрос создает реальный метод main(). который wxWidgets использует. Он также создает экземпляр объекта приложения и начинает процесс инициализации.

Определение класса фрейма

Теперь определите класс фрейма, который будет представлять главное окно вашего приложения. Родительским классом wxWidgets является wxFrame. В листинге 1 приведен короткий пример.

Листинг 1. Пример класса wxFrame

Рассмотрим имена, которые вам могут быть не знакомы. wxString - это специализированный wxWidgets-класс, являющийся оболочкой над string и использующийся для операций со строками в инструментальном наборе wxWidgets. wxWidgets не использует классы Standard Template Library (STL), для того чтобы не ограничивать использование wxWidgets платформами, на которых доступна STL (если захотите, можете указать ключ командной строки во время компиляции для использования STL). Аналогично, wxCommandEvent - один из родительских классов для событий, в частности, управляющих (command) событий, которые представляют собой высокоуровневые события, обычно относящиеся к действиям пользователя, например, нажатие кнопки или выбор из списка. Наконец, макрос DECLARE_EVENT_TABLE нужен любому wxWidgets-объекту, желающему реагировать на события. Этот макрос в данной статье реализует небольшой демонстрационный фрейм.

Определение таблицы событий

Для реального реагирования на события вы должны определить таблицу событий внутри ваших файлов. Это еще один макрос, и он (в нашем случае) выглядит так, как показано в листинге 2.

Листинг 2. Макрос таблицы событий

Макрос BEGIN_EVENT_TABLE() принимает два аргумента: класс, для которого предназначена таблица событий, и прямой предок этого класса. Макрос END_EVENT_TABLE. как и ожидается, обозначает конец таблицы событий. Между этими макросами вы можете указать любое число макросов для конкретных событий. В примере данной статьи используется только один.

Инструментальный набор wxWidgets имеет несколько различных макросов событий, каждый из которых соответствует различным типам событий. В данном случае EVT_BUTTON соответствует нажатию на кнопку. Первым параметром макроса является идентификатор, указывающий конкретную кнопку, которая будет обрабатываться. Идентификатор wxID_CLOSE является одним из нескольких предопределенных идентификаторов, связанных с обычными функциональными возможностями приложения. Предопределенный идентификатор здесь используется исключительно для удобства, хотя в некоторых случаях используются специализированные идентификаторы, которые активизируют специальную обработку системой wxWidgets. Вторым параметром макроса является полностью квалифицированное имя метода, который должен быть вызван при активизации события. Все события в wxWidgets управляются с использованием макросов событий, аналогичных описанному.

Определение ваших методов

Теперь наступило время начать определять некоторые методы. Я показываю три простых метода, начиная с метода OnInit(). приведенного в листинге 3.

Листинг 3. Метод OnInit()

Первые две строки метода делают то, что вы и ожидали бы при старте GUI-программы - они создают и показывают главное окно. Однако третья строка, на самом деле, является самой важной для приложения. Возврат значения true указывает механизму wxWidgets на то, что инициализация прошла успешно, и программа может продолжать свою работу. Возврат значения false. наоборот, остановил бы приложение и вызвал бы выход из него.

Метод OnInit() ссылается на конструктор DemoFrame. В этом конструкторе вы добавляете кнопку в ваш фрейм, как показано в листинге 4.

Листинг 4. Добавление кнопки в ваш фрейм

Перед добавлением кнопки во фрейм вы создаете калибратор ( sizer ). Калибратор является wxWidgets-эквивалентом менеджеров схем языка программирования Java: калибраторы позволяют вам использовать предопределенные правила для размещения объектов в вашем окне вместо необходимости указания размера и позиции каждого виджета по отдельности. В данном случае вы используете wxBoxSizer. который размещает виджеты на прямой линии (этот калибратор может быть вертикальным или горизонтальным). После создания калибратора вы присоединяете его к фрейму при помощи метода SetSizer(). Затем вы создаете кнопку. Параметры для конструктора кнопки таковы:

  • Родительский виджет (в данном случае фрейм)
  • ID, имеющий тип integer
  • Отображаемый на кнопке текст

Вам не нужно явно добавлять кнопку во фрейм; достаточно указания фрейма в качестве родительского контейнера. Однако, вы должны явно добавить кнопку в калибратор, для того чтобы алгоритм схемы размещения калибратора знал о ней. Это делается в последней строке метода, но не перед добавлением пустой области размером 50 x 50 пикселей в начале строки. При добавлении кнопки вы указываете также калибратору окружить кнопку границей толщиной в 50 пикселей. Это делается путем использования флага wxALL и последнего аргумента - числа 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-вызовами. В обоих случаях вы создаете объект приложения и объект фрейма. Вы также начинаете с метода OnInit() и определяете похожие конструкторы и обработчики объектов.

Самым большим отличием в данном конкретном примере является связывание событий с обработчиками. Там, где C++-версия выполняет это связывание при помощи макросов таблицы событий, Python-версия использует метод Bind(). который принимает в качестве аргументов Python-объект, представляющий тип события и метод, вызываемый при наступлении события. Такая структура использует способность Python рассматривать методы как переменные и передавать их в качестве аргументов точно так же, как типы string или integer.

Преимущества wxPython перед C++ wxWidgets начинают проявляться в больших или более сложных программах. Если не отвлекаться на дебаты об относительных преимуществах C++ и Python как языков программирования, существуют некоторые отличные функциональнее возможности, присущие wxPython-версии, которые могут быть привлекательны для вас. Механизм обработки событий с использованием методов Bind() более легко вписывается в wxPython-версию, чем в wxWidgets. В Python-версии легче динамически обновить ваши обработчики во время исполнения. Некоторые сложные или составные виджеты, такие как древовидные списки или зависимая кнопка с изображением, являются стандартными в wxPython, но их нет в C++-версии. Также wxPython содержит пакет средств разработки Py, который делает тривиальной задачу добавления интерактивной отладки в вашу wxPython-программу.

wxEverythingElse

Python - это не единственный язык программирования, имеющий средства доступа к библиотеке 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-пакета, а также используется вызов функции EVT_BUTTON. который выглядит аналогично определению макроса в C++-версии.

wxRuby

Проект wxRuby находится в несколько не простом состоянии. Существует сырая программа, в которой связывание с wxWidgets API осуществляется вручную. Последняя версия этой программы была выпущена в ноябре 2004, и с этого времени продолжалась (с перерывами) разработка версии, которая использует более мощную программу Simplified Wrapper and Interface Generator (SWIG) для генерирования связей между Ruby и wxWidgets. Новая версия была недавно описана в списке рассылки как почти готовая: "Через пару дней…, или, возможно, в течение нескольких месяцев".

Одним интересным моментом относительно wxRuby является то, что в отличие от большинства других wxWidgets-оболочек у разработчиков есть возможность подгонять имена API-вызовов wxWidgets, для большего соответствуя соглашению о наименованиях в Ruby (например, lower_case_with_underscores вместо wxWidgets UpperCaseWithCamelCase ). То есть, в то время как весь приведенный выше код примеров использовал функцию SetSizer(). wxRuby вызывает set_sizer(). За исключением этого часть wxRuby-программы, работающая с wxWidgets API, будет практически аналогична приведенным выше

Мир wxWidgets

Другие порты wxWidgets находятся на разных стадиях завершенности или незавершенности. Ниже представлен краткий экскурс в область wxWidgets:

  • wxBasic - это интерпретатор языка Basic и набор средств связывания с wxWidgets. Находится в процессе выпуска новой версии (последняя бета-версия вышла в мае 2006 года).
  • wxEuphoria последний раз была выпушена в декабре 2005 года; представляет собой набор средств связывания wxWidgets с языком программирования Euphoria.
  • wxJS - это JavaScript-порт wxWidgets. Он протестирован только на системах Windows и включает исполняемые файлы для запуска JavaScript-сценариев. Он тоже последний раз выпускался в мае 2006 года. Разработчики анонсировали, что следующая версия будет поддерживать Linux.
  • wxLua - это набор средств связывания с языком программирования Lua. Он является кросс-платформенным и имеет относительно небольшой размер; последняя версия была выпущена в марте 2006 года.
  • Проект wx.NET связывает C# с wxWidgets. Последняя версия выходила в июле 2005 года.
Резюме

Мир wxWidgets может много чего предложить программистам всех мастей. Базовый набор программ является гибким и может удовлетворить большинство ваших GUI-потребностей. Различные пакеты для связывания позволяют wxWidgets находиться в пределах досягаемости для большинства программистов. Использование инструментального набора wxWidgets с предпочитаемым языком программирования поможет вам создать отлично выглядящие интерфейсы для ваших собственных приложений.

Ресурсы Научиться
  • Оригинал статьи "Build cross-platform GUIs using wxWidgets ".
  • "Кросс-платформенное GUI-программирование с использованием wxWidgets " Джулиана Смарта (Julian Smart), Кевина Хока (Kevin Hock) и Стефана Ксомора (Stefan Csomor) (Prentice Hall, 2005) является официальной книгой по wxWidgets.
  • "wxPython на практике " Ноэла Рэппина (Noel Rappin) и Робина Данна (Robin Dunn) (Manning, 2006) является официальной книгой по wxPython.
  • Интерактивная документация по wxWidgets доступна на странице документации по wxWidgets. Другие порты часто используют документацию по wxWidgets в качестве справки.
  • Страница wxWiki помогла мне настроить мой проект wxWidgets в среде Apple Xcode.
  • В зоне developerWorks Linux размещены дополнительные ресурсы для Linux-разработчиков.
  • Следите за техническими событиями и web-конференциями developerWorks.
Получить продукты и технологии
  • Основной пакет wxWidgets доступен для загрузки на сайте wxWidgets.
  • wxPython можно загрузить с сайта wxPython.
  • Дополнительная информация по wxPerl и его загрузке размещена на Sourceforge.net.
  • Дополнительная информация по загрузке wxRuby размещена на wxRuby wiki.
  • Дополнительная информация по связыванию с другими языками программирования доступна на соответствующих домашних страницах:
    • wxBasic
    • wxEuphoria
    • wxJS
    • wxLua
    • wx.NET
  • Разработайте ваш следующий Linux-проект с использованием пробного программного обеспечения IBM. доступного для загрузки непосредственно с сайта developerWorks.
Обсудить Комментарии