Глава i

Allegro

  • Much like SDL, Allegro is a cross-platform c library (with quite a bit of assembly used in the backend) for programming games.
  • Almost as old as wxWidgets (circa 1993).
  • Giftware license (essentially public domain).
  • Requires gcc and an assembler to build.
  • Development has been stuck in the same version for years, there are a lack of core developers (original developer is no longer on the team), and there are some internal disputes which may lead to a fork.
  • Very basic GUI functionality — only supports one window with only bare bones operations supported — you can’t move the window, etc.
  • «Controls» are sort of supported in allegro also through functions with (many) variable-length arguments, and are owner drawn much like QT (but don’t look as good by default). They can be customized via a relatively easy API (and there are a few sub libraries that already have somewhat fair-looking versions).
  • Non-GUI routines (input, etc.) are lower-level and generally faster than wxWidgets’ native implementations.
  • Can be used with wxWidgets without too much trouble — since allegro has some platform specific functions to get the window handle, you can create a wxWidgets window from the window handle and do what you want from that from that point on. While wxWindows uses a wxApp to handle platform-specific main/WinMain stuff, Allegro requres you put END_OF_MAIN() after your main function — getting the two to work together is somewhat of a task, but not a very large one.

wxWidgets и объектно-ориентированное программирование

Как и большинство современных фреймворков, wxWidgets активно использует концепции объектно-ориентированного программирования. Каждое окно представляется в виде объекта C++. Эти объекты имеют определенное поведение, могут получать различные сообщения и реагировать на них. То, что в результате видит пользователь, является визуальным отображением взаимодействия системы объектов. Вы, как программист, должны управлять коллективным поведением объектов. Эту задачу выполнить достаточно легко, так как некоторое стандартное поведение элементов библиотека wxWidgets уже реализовала за вас.

Конечно, связав вместе объектно-ориентированный подход и GUI, можно достичь неплохих результатов

Объектно-ориентированный язык Smalltalk, разработанный в 1970-м году Аланом Каем (Alan Kay), стал важной вехой в развитии GUI, принес инновации в технологию пользовательских интерфейсов и структуры языка, и хотя wxWidgets использует другой язык и API, но основные принципы построения по большей части остались теми же

<< назад | начало | вперед >>

Создание пользовательского интерфейса[править]

Открываем wxFormBuilder, будет создан проект по умолчанию. Дадим ему имя (name) gui и такое же значение свойству file.

Теперь сохраним проект в папку GUI, которую мы создали в Visual Studio. Она находится в Документы->Visual Studio 2015->Projects->wxHello->wxHello (\Documents\Visual Studio 2015\Projects\wxHello\wxHello). Дадим файлу проекта название gui (gui.fbp). Сохраняем.

В панели компонентов (Component Palette) выбираем вкладку Forms. На ней жмем иконку Frame. Будет создан фрейм (форма). Дадим ей имя frmMain

Теперь перейдем во вкладку Layout и нажмем на первую по счету иконку wxBoxSizer. Внутри проектируемой формы появится красная рамочка — это разместитель (sizer). Он будет управлять размещением вложенных в него компонентов на форме (друг над другом).

Далее перейдем на вкладку Common и нажмем на иконку Static Text. Внутри разместителя в верхнем левом углу формы появится новый объект wxStaticText «MyLabel». Изменим его свойство label на «Hello World!».

В разделе sizeritembase распахнем flags и поставим галочку у флага wxALIGN_CENTER. Теперь надпись будет в центре по горизонтали.

Далее в разделе wxWindow распахнем font и увеличим размер шрифта до 30 (или можете ввести свое значение). Надпись изменит свой размер.

Пока достаточно. Мы неплохо потрудились над дизайном. Попробуем сгенерировать C++ код GUI нашего приложения.

Откроем пункт меню ->.

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

Это формирует файлы отнаследованных классов, с которыми мы будем дальше работать

Обратите внимание, что эта процедура должна производиться только один раз! Иначе код который мы создадим в Visual Studio «затрется» заново сгенерированным.. «Но как же так? Как дальше работать с проектом если всё затирается новым кодом?» — наверняка спросите вы и будете абсолютно правы

Да, затирается, но нужно просто не генерировать в дальнейшем отнаследованные классы, а генеровать лишь код базовых (материнских) классов, при этом дочерние классы унаследуют весь дизайн базовых и наш код на С++, который «неимоверными усилиями» мы будем писать дальше никуда не пропадет.

«Но как же так? Как дальше работать с проектом если всё затирается новым кодом?» — наверняка спросите вы и будете абсолютно правы. Да, затирается, но нужно просто не генерировать в дальнейшем отнаследованные классы, а генеровать лишь код базовых (материнских) классов, при этом дочерние классы унаследуют весь дизайн базовых и наш код на С++, который «неимоверными усилиями» мы будем писать дальше никуда не пропадет.

Закончив с этим, не забудьте нажать ->, чтобы сохранить проект. Всё, формбилдер можно закрыть.

Tag handlers

The handler is derived from wxHtmlWinTagHandler (or directly from wxHtmlTagHandler).

You can use set of macros to define the handler (see src/html/m_*.cpp files for details). Handler definition must start with TAG_HANDLER_BEGIN macro and end with TAG_HANDLER_END macro.

I strongly recommend to have a look at include/wxhtml/mod_templ.h file. Otherwise you won’t understand the structure of macros.

See macros reference:

TAG_HANDLER_BEGIN(name, tags): Starts handler definition. name is handler identifier (in fact part of class name), tags is string containing list of tags supported by this handler (in uppercase). This macro derives new class from wxHtmlWinTagHandler and implements it is wxHtmlTagHandler::GetSupportedTags method. Example: TAG_HANDLER_BEGIN(FONTS, «B,I,U,T»)

TAG_HANDLER_VARS: This macro starts block of variables definitions. (Variables are identical to class attributes.) Example:

TAG_HANDLER_BEGIN(VARS_ONLY, «CRAZYTAG»)
TAG_HANDLER_VARS
int my_int_var;
wxString something_else;
TAG_HANDLER_END(VARS_ONLY)

This macro is used only in rare cases.

TAG_HANDLER_CONSTR(name): This macro supplies object constructor. name is same name as the one from TAG_HANDLER_BEGIN macro. Body of constructor follow after this macro (you must use { and } ). Example:

TAG_HANDLER_BEGIN(VARS2, «CRAZYTAG»)
TAG_HANDLER_VARS
int my_int_var;
TAG_HANDLER_CONSTR(vars2)
{

my_int_var = 666;
}

TAG_HANDLER_END(VARS2)

Never used in wxHTML 🙂

TAG_HANDLER_PROC(varib): This is very important macro. It defines wxHtmlTagHandler::HandleTag method. varib is name of parameter passed to the method, usually tag. Body of method follows after this macro. Note than you must use { and } ! Example:

TAG_HANDLER_BEGIN(TITLE, «TITLE»)
TAG_HANDLER_PROC(tag)
{
printf(«TITLE found…\n»);
}
TAG_HANDLER_END(TITLE)

TAG_HANDLER_END(name): Ends definition of tag handler name.

Отсечение невидимых Widget’ов

Обычно, если в каком-то месте много Widget’ов, то большинство их них не видны. Это списки, деревья и зоны прокрутки. Очевидно то, что скрыто, можно не рисовать. И даже более — не обсчитывать в некоторых ситуациях.

Для начала отсечение невидимых. Как ни странно, отсечение на уровне графического API решает проблему частично, видеокарта не растеризует отсеченные прямоугольники и пиксели. Однако, мы все еще формируем батчи для них и отсылаем в видеокарту. На этом можно сэкономить.

Чтобы понять, что какой-то Widget скрыт, нужно знать зону отсечения его родителей, а так же свою полную площадь с учетом всех слоев и детей. При изменении трансформации или каких-либо параметров, эта площадь пересчитывается, начиная от самых конечных детей.

Далее, в Widget’е есть специальный метод CheckClipping, который определяет отсечен ли он. Здесь же еще одна оптимизация: проверка на отсечение в основном нужна при прокрутке, то есть при линейных сдвигах. Например, есть зона прокрутки с кучей дочерних Widget’ов. Обычно прокрутка происходит вверх-вниз или влево-вправо, и размеры элементов не меняются. Поэтому достаточно взять площадь элемента и просто сдвинуть ее на величину прокрутки.

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

Краткая история wxWidgets

Проект wxWidgets берет свое начало в 1992, когда Джулиан Смарт (Julian Smart) начал работать в университете Эдинбурга над разработкой инструмента для создания диаграмм, который назывался Hardy. Ему не хотелось выбирать платформу для работы программы (рабочие станции SUN и PC), поэтому он решил использовать мультиплатформенный фреймворк. В связи с тем, что в то время число существующих фреймворков было невелико, да и покупка одного из них не входила в планы подразделения, было принято решение написать свой собственный. В сентябре 1992 года с разрешения университета на ftp-сервер факультета была помещена первая версия библиотеки, и другие разработчики получили возможность использовать этот проект. В самом начале wxWidgets был написан с использованием XView и MFC 1.0, но так как Borland C++ не поддерживал MFC, то в скором времени библиотека была переписана на чистом Win32. XView берет свое начало из Motif, так что очень скоро появился порт под Motif.

Спустя некоторое время сформировалось маленькое, но весьма активное сообщество пользователей, и был создан почтовый список рассылки. Стали приходить дополнения и исправления ошибок, включая порт на Xt от Маркуса Хользема (Markus Holzem). Проект постепенно привлекал все больше и больше пользователей по всему миру: отдельные пользователи, академики, правительственные подразделения и множество корпоративных пользователей, которые поняли, что wxWidgets предлагает более удачный продукт и поддержку, чем те коммерческие проекты, услугами которых они пользовались или собирались пользоваться.

В 1997 году с помощью Маркуса Хользема был спроектирован новый API для wxWidgets версии~2. Вольфрам Глогер (Wolfram Gloger) решил, что wxWidgets должна быть портирована на GTK+ и адаптировал библиотеку под среду GNOME. Роберт Роублинг (Robert Roebling) стал главным разработчиком для порта wxGTK, который в данный момент является основным для систем Unix/Linux. В 1998 году версии под Windows и GTK+ были объединены и помещены в единое хранилище версий. Также в этом году к проекту присоединился Вадим Зейтлин (Vadim Zeitlin), который добавил большое количество кода и технических решений, а также Стефан Ксомор (Stefan Csomor), начавший портирование библиотеки на платформу Mac OS.

В 1999 увидел свет впечатляющий компонент Вацлава Славика (Vaclav Slavik) — wxHTML и просмотрщик для файлов помощи на базе HTML.

В 2000 году компания SciTech Inc. спонсировала начальную разработку wxUniversal — собственных элементов управления wxWidgets, которые можно использовать на платформах, где вообще отсутствуют элементы управления. wxUniversal был впервые использован в приложении SciTech на платформе MGL, которая является низкоуровневой графической прослойкой.

В 2002 году Джулиан Смарт (Julian Smart) и Роберт Роублинг добавили порт wxX11, используя наработки wxUniversal. Требующий только Unix и X11, порт wxX11 очень хорошо подходит для систем с низкой производительностью.

В июле 2003 wxWidgets смогли запустить на Windows CE, и Роберт Роублинг демонстрировал приложение wxGTK, запущенное на встроенной Linux-платформе GPE.

В 2004 году под давлением фирмы Microsoft название проекта было изменено с начального > на >.

Также в 2004 Стефан Ксомор и еще часть разработчиков полностью переписали порт wxMac под систему OS X, существенно повысив качество и функциональность приложений в OS X. Под руководством Дэвида Эллиота (David Elliot) порт, использующий Cocoa, также был существенно улучшен. Вильям Осборн (William Osborne) выиграл соревнование по портированию wxWidgets на платформу Palm OS 6 для запуска простейшего примера > из поставки wxWidgets. Версия~2.6 была выпущена в апреле 2005 года, объединив все основные улучшения во все порты.

Бонус: anti-aliased линии

Иногда в редакторе нужно рисовать линии и кривые. Те, кто пользовался OpenGL или D3D, знают, что по умолчанию линии рисуются с «лесенкой». Но я хотел себе гладкие линии.

Есть разные подходы к отрисовке графики а anti-aliasing’ом. Я решил попробовать один простой трюк: рисовать по краям линии полигоны, уходящие в нулевую альфу, то есть в плавно исчезающие. И так как эти края очень маленькие, но все же есть, при растеризации видеокарта выбирает некоторые полупрозрачные пиксели с краев основного тела линии, и получается эффект сглаживания.

Дешево в плане рендеринга, но тяжеловато в расчете таких мешей. Ведь есть еще проблема с острыми углами, и там получается 8 проверок пересечения лучей. Но это уже другая история. В целом результат после «подгона» параметров вполне хорош

Positive Thinking

It is common to blow up the problem in one’s imagination, so that it seems to threaten weeks, months or even years of work. The problem you face may seem insurmountable: but almost never is. Once you have been programming for some time, you will be able to remember similar incidents that threw you into the depths of despair. But remember, you always solved the problem, somehow!

Perseverance is often the key, even though a seemingly trivial problem can take an apparently inordinate amount of time to solve. In the end, you will probably wonder why you worried so much. That’s not to say it isn’t painful at the time. Try not to worry – there are many more important things in life.

Технические особенности и преимущества

wxWidgets — это инструмент разработчика для написания настольных или мобильных приложений с графическим интерфейсом (GUI), который экономит много времени на написание кроссплатформенных приложений и обеспечивает их стандартное поведение.

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

Такие развитые средства библиотеки wxWidgets позволяют писать программы на базе единого API и компилировать на множестве компьютерных платформ с минимальными изменениями в исходном коде либо вообще без них. Она поддерживает системы Microsoft Windows, Apple Macintosh, UNIX-подобные (для X11, Motif и GTK+), OpenVMS и OS/2. Встраиваемая (Embedded) версия находится в разработке.

Библиотека написана на C++, но может подключаться ко множеству других распространённых языков, таких, как Ruby (wxRuby, Anvil), Python (wxPython), Smalltalk (wxSqueak), Perl, Erlang, Haskell, Lua.

Среди компиляторов C++ поддерживаются:

  • GCC и его портированные варианты Cygwin, MinGW и emx+gcc
  • Microsoft Visual C++
  • Borland C++
  • Watcom C++
  • VisualAge
  • Symantec C++
  • Digital Mars C++

Важная особенность wxWidgets: в отличие от некоторых других библиотек (Swing, Qt и др.), она максимально использует «родные» графические элементы интерфейса операционной системы всюду, где это возможно. Это существенное преимущество для многих пользователей, поскольку они привыкают работать в конкретной среде, и изменения интерфейса программ часто вызывают затруднения в их работе.

Также wxWidgets обладает всеми преимуществами, присущими бесплатной свободной платформе:

нулевая стоимость позволяет легко использовать её небогатым малым фирмам и индивидуальным разработчикам и экономить бюджет крупным организациям;
открытый исходный код обеспечивает чрезвычайно долгий срок жизни проекта даже при отходе от него первоначальных создателей, что позволяет гарантировать долгосрочное развитие и всех производных проектов;
открытый код позволяет свободно производить его аудит (что важно для приложений, использующихся в критических сферах) и при необходимости самостоятельно модифицировать с добавлением нужных функций, не полагаясь на добрую волю исходного разработчика. Этот момент особенно ценен для внутрикорпоративного применения.. Более того, крайне «либеральная» лицензия wxWidgets допускает линковку с несвободными фрагментами кода, что позволяет использовать её и в закрытых коммерческих проектах.

Более того, крайне «либеральная» лицензия wxWidgets допускает линковку с несвободными фрагментами кода, что позволяет использовать её и в закрытых коммерческих проектах.

Все вышеперечисленные особенности способствовали популярности библиотеки у самых разных разработчиков — от программистов-энтузиастов до крупных корпораций и государственных учреждений (в числе которых Xerox, AMD, NASA и многие другие).

Layout-Widget’ы

Это специальные Widget’ы, отвечающие за определенные алгоритмы расположения дочерних Widget’ов. Например, раскладывает своих детей в линию по горизонтали. Аналогично работает , только раскладывает по вертикали. А так же есть , который раскладывает равномерной сеткой.

Комбинация Horizontal/VerticalLayout

У этих Layout’ов можно настраивать точку отсчета (от угла, середины), расстояние между элементами, растягивать ли элементы по горизонтали или вертикали. Эти настройки позволяют покрыть практически все возможные вариации с адаптивной версткой.

Пример адаптивной верстки в редакторе параметров

Алгоритм у этих Layout’ов такой:

  • Рекурсивно рассчитываем размеры дочерних Widget’ов. То есть как бы заглядываем в будущее, какого размера они будут. За основу берем минимальный размер элементов

  • Рассчитываем пространство, которое дочерние элементы могут занять. Берем текущий размер Layout’а, вычитаем все минимальные размеры дочерних элементов, вычитаем промежутки между ними. Получается «пространство, которое можно распределить»

  • Пытаемся распределить это свободное место между элементами. Но если для какого-то элемента этого пространства оказывается слишком много, то есть у него ограничен максимальный размер, он исключается из алгоритма и пространство распределяется уже без него

  • Получив конечные размеры дочерних элементов, им проставляются соответствующие параметры WidgetLayout

Compiling the Samples

The following paragraphs describe compiling the samples included in a standard wxWidgets install on various systems.

Visual C++

To compile the samples go to the ‘samples’ subdirectory in the directory where you installed wxWidgets. In this directory open the file samples.dsw (VC6) or samples.sln (Visual C++ 7 or later).

Once opened make sure that ‘class view’ is enabled. To enable class view select it from the Main-menu->View->Class-View. In the class view pane right click the project named ‘Minimal’ and select ‘Set as Startup Project’ from the context menu (popup menu). You can now press F5 to build and run the minimal project. If everything is well a window should popup.

Have fun doing the same with the other projects in the list and see what wxWidgets is capable of.

Отклик на щелчок кнопки[править]

Так как кнопки обычно вызывают какое то действие при нажатии, давайте сделаем нашу кнопку закрывающей окно. Первое, что мы должны сделать, заключается в том, чтобы изменить текст, отображаемый на кнопке, чтобы сообщить пользователю, что кнопка делает. Это делается, точно так же как и в случае с элементом wxStaticText. Выберите кнопку, найдите Label в обозревателе свойств и поменяйте его значение на «Close» (или что-нибудь, что вам нравится).

Далее нужно назначить этой кнопке обработчик событий. В своей основе обработчики событий — это функции, которые вызываются при возникновении некоторых «событий». В нашем случае вместо «событие» можно сказать более описательно — «нажатие на кнопку», потому что это то, что мы хотим обработать. Как и другие конструкторы GUI, wxSmith может автоматически генерировать код каркаса для таких обработчиков. Чтобы использовать эту возможность, переключитесь из браузера свойств в браузера событий, нажав на второй значок в верхней части обозревателя свойств. Этот значок изображает {} тем самым предлагая код C++.

После нажатия на этот значок, вы увидите все события, поддерживаемые текущим выбранным компонентом. Класс wxButton поддерживает только одно событие — событие EVT_BUTTON, поэтому только его и можно видеть. Когда вы нажмете на это событие и распахнете поле со списком, вы увидите доступные параметры и обработчики для этого события:

Если выбрать — None — функция обработчика к этому событию автоматически назначаться не будет. (Но она всегда может быть установлена вручную). Выбор — Add new handler — будет генерировать каркас для кода новой функции обработчика. Ниже приведены другие обработчики событий, известных wxSmith, которые могут быть назначены к этому событию. Мы видим здесь, OnQuit и OnAbout. Эти обработчики были созданы мастером. Мы могли бы использовать обработчик OnQuit, но чтобы увидеть, что происходит, напишем наш собственный обработчик. Выберите вариант Add new handler. У вас будет запрошено имя обработчика. Это имя — просто имя функции, которая будет вызываться в качестве реакции на это событие. wxSmith будет предложено имя OnButton1Click, и мы можем также использовать его.

При вводе нового имени обработчика, wxSmith будет генерировать каркас кода новой функции обработчика с таким именем. Откройте файл программы с нужным исходным кодом и поместите курсор внутри функции обработчика. (Может потребоваться прокрутка вверх или вниз, чтобы показать строку с курсором.) Эта функция является членом класса, который мы создали, поэтому она может получить доступ ко всем функции в этом классе, включая функцию Close(), которая была создана с помощью мастера. Поэтому, когда мы хотим закрыть наше окно, мы просто вызываем функцию Close(). Результат выглядит так:

Выполните сборку и запуск нашего проекта. Он должен показать наш текст «Hello, World!» и нашу кнопку «Close».

Нажмите кнопку Close, и он должен закрыться.

Это конец первого урока. Надеюсь, что вы легко справились и начали чувствовать себя комфортно с Code::Blocks и wxSmith.

Оглавление | Далее

Создаем новый проект wxWidgets[править]

После загрузки и установки Code::Blocks дважды щелкните значок на рабочем столе, чтобы запустить его. Вот окно открытия Code::Blocks:

Нажмите «Создать новый проект»,

а затем найдите и дважды щелкните значок проекта wxWidgets Project, на который указывает курсор на скриншоте ниже.

Следующий экран — экран «Добро пожаловать».

Если вам вовсе не нравится приветствие программы, установите флажок, который устраняет его при запуске в будущем.

Следующий экран выглядит следующим образом:

Выберите wxWidgets 2.8x и нажмите кнопку «Next >» в нижней части экрана.

Это приведет к открытию окна, где нужно указать название и папку проекта, в которых вы хотите сохранить проект. Затем заполняются другие поля. Например, в качестве названия проекта выбран «HelloWorld», а затем (автоматически) настроены остальные поля, что выглядит следующим образом:

Затем нажмите кнопку “Next >” внизу.
Следующий экран, показанный ниже, позволяет пометить вашу работу своей личными данными. Заполните то, что пожелаете.

Это вызывает окно для выбора построителя GUI, который вы хотите использовать: wxSmith или FormBuilder. Выбираем, конечно же, wxSmith.

Нажмите кнопку «Next» в нижней части.

На следующем экране нужно указать расположение библиотеки WxWidgets с которой будет компоноваться проект:

Оставьте настройку по умолчанию $(#wx). Это ссылка на глобальную переменную wx, которая задает путь к wxWidgets в настройках Code::Blocks. Также если это расположение никогда не указывалось ранее может быть открыта форма настройки глобальных переменных:

Нужно указать «корневой» каталог библиолитеки wxWidgets в поле «base». Обратите внимение, чтобы в поле «current variable» при этом была выбрана переменная «wx».

Следующий экран мастера настойки задаёт, какой компилятор C++ мы хотим использовать и хотим ли мы отладочную сборку (с дополнительным кодом для отладки) или меньшую по размерам конечную сборку (для конечного пользователя). Выбираем компилятор GNU CPP и параметры обеих сборок: расположить в отдельных вложенных папках.

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

Примем вариант по умолчанию. Но, внизу, мы выбираем опцию “Create and use precompiled headers» (создание и использование предварительно скомпилированных заголовков), которая ускоряет следующие за первой компиляции

Обратите также внимание, что опции библиотеки wxWidgets должны быть проставлены в стогом соответствии с параметрами, использованными при сборке (компиляции) библиотек, иначе проект не будет собираться.

В форме выбора каталога для сохранения проекта мы выбрали реальный каталог, но, такой выбор может привести к проблемам, если потребуется скомпилировать проект на других компьютерах. Другой вариант заключается в использовании глобальной переменной системы. Чтобы открыть ниже диалоговое окно или модифицировать или изменить эту глобальную переменную, нужно нажать на пункт главного меню Code::Blocks Settings | Global variables. Это открывает редактор глобальных переменных.

Если им воспользоваться, расположение библиотеки wxWidgets будет считываться из переменной, которую вы зададите. Это означает, что местоположение каталога wxWidgets задано не жестко внутри вашего проекта, а хранится внутри глобальной конфигурации Code::Blocks. Когда проект открыт на другом компьютере, он будет использовать конфигурацию этого (другого) компьютера. Самый простой вариант для использования этой глобальной переменной является оставить $(#wx), что означает использовать глобальную переменную с именем wx. Это имя зарезервировано для wxWidgets и его следует выбирать в большинстве случаев.

Когда глобальная переменная используется в первый раз, будет запрошен каталог wxWidgets. Единственное, что вам в этом случае нужно сделать — ввести правильное расположение в поле base. Такая необходимость возникает только при первом использовании, так как в дальнейшем Code::Blocks будет автоматически использовать указанный параметр для других проектов, которые вы создаете.

Microsoft Visual C++ Compilation {#msw_build_msvs}

  1. Open a «Visual Studio Command Prompt» window shortcut to which
    must have been installed to the «Start» menu or the «Start» screen
    by MSVS installation.

  2. Change directory to %WXWIN%\build\msw and type

    to build wxWidgets in the default debug configuration as a static
    library. You can also do

    to build a release version or

    to build a 32 bit release DLL version from an x86 command prompt, or

    to build a 64 bit release DLL version from an x64 command prompt.

    See «Configuring the Build» for more information about the
    additional parameters that can be specified on the command line.

  3. To verify your build, change the directory to %WXWIN%\samples\minimal and
    run the same nmake command (with the same parameters there), this
    should create a working minimal wxWidgets sample.

  4. If you need to rebuild, use «clean» target first or «nmake /a».

From the IDE using the provided project files:

Ready to use project files are provided for VC++ versions 7, 8, 9,
10, 11, 12, 14, 15 and 16 (also known as MSVS 2003, 2005, 2008, 2010, 2012,
2013, 2015, 2017 and 2019 respectively).

Simply open (for N=7, 8, 9, 10, 11, 12, 14, 15 or 16) file,
select the appropriate configuration (Debug or Release, static or DLL)
and build the solution. Notice that when building a DLL configuration,
you may need to perform the build several times because the projects
are not always built in the correct order, and this may result in link
errors. Simply do the build again, up to 3 times, to fix this.

Special notes for Visual Studio 2010+

For Visual Studio 2010+ solutions it is possible to customize the build by
creating a file in the build\msw directory which is used, if it
exists, by the projects. The settings in that file override the default values
for the properties such as wxCfg (corresponding to the CFG makefile variable
described below) or wxVendor (corresponding to VENDOR). The typical way to
make the file is to copy to and then edit local.

For example, if you are building wxWidgets libraries using multiple versions
of Visual Studio you could change wxCompilerPrefix to include the toolset:

Following that example if you are using Visual Studio 2013 and open
it will build using the «vc120» prefix for the build directories
so to allow its build files to coexist with the files produced by the other
MSVC versions.

Keep in mind that by using a separate local props file you ensure that your
changes won’t be lost when updating to a future wxWidgets version. But if
is updated in some later commit your is not
updated with it. For example the version information in could
change and the information in your would be outdated. It is
your responsibility to monitor for such situations.

Improve debugging for Visual Studio 2012+

Debug visualizers for Visual Studio 2012+ are provided which makes inspecting
various wxWidgets classes easier to view while debugging. To use them:

  1. Open the folder %WXWIN%\misc\msvc
  2. Open the folder %USERPROFILE%\My Documents\Visual Studio 2012\Visualizers
    (or the corresponding location for newer versions, e.g. …2013\Visualizers)
  3. Copy wxWidgets.natvis and autoexp.inc
  4. For Visual Studio 2013+ additionally copy wxWidgets.2013.natvis

List of Supported Tags

A NAME=
HREF=
TARGET=
ADDRESS
AREA SHAPE=POLY
SHAPE=CIRCLE
SHAPE=RECT
COORDS=
HREF=
B
BIG
BLOCKQUOTE
BODY TEXT=
LINK=
BGCOLOR=
BR ALIGN=
CENTER
CITE
CODE
DD
DIV ALIGN=
DL
DT
EM
FONT COLOR=
SIZE=
FACE=
HR ALIGN=
SIZE=
WIDTH=
NOSHADE
H1
H2
H3
H4
H5
H6
I
IMG SRC=
WIDTH=
HEIGHT=
ALIGN=TEXTTOP
ALIGN=CENTER
ALIGN=ABSCENTER
ALIGN=BOTTOM
USEMAP=
KBD
LI
MAP NAME=
META HTTP-EQUIV=»Content-Type»

CONTENT=
OL
P ALIGN=
PRE
SAMP
SMALL
SPAN
STRIKE
STRONG
SUB
SUP
TABLE ALIGN=
WIDTH=
BORDER=
VALIGN=
BGCOLOR=
CELLSPACING=
CELLPADDING=
TD ALIGN=
VALIGN=
BGCOLOR=
WIDTH=
COLSPAN=
ROWSPAN=
NOWRAP
TH ALIGN=
VALIGN=
BGCOLOR=
WIDTH=
COLSPAN=
ROWSPAN=
TITLE
TR ALIGN=
VALIGN=
BGCOLOR=
TT
U
UL

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий