Juce: бинарные ресурсы и фоновая графика
Содержание:
1. Введение;
2. Используем The Jucer;
3. Вложенные компоновки;
4.Бинарные ресурсы и фоновая графика (Вы читаете данный раздел).
The Jucer позволяет очень просто и элегантно работать с любыми бинарными ресурсами. Предположим, мы хотим использовать в программе графический файл juce.png. Переходим на вкладку Resources и добавляем этот файл в список. При сохранении бинарные данные из этого файла переводятся в форму обычного массива С++ и непосредственно вставляются в код. Соответствующая строка имеет вид:
В классе автоматически создается переменная cachedlmage_ juce_png типа Image*, которая инициализируется данными этого массива в конструкторе. Ее можно использовать в коде для доступа к ресурсу. Весь служебный код для работы с такими ресурсами (а его немало) создается автоматически.
Имея набор графических файлов, загруженных в виде ресурсов, можно переходить к одной из наиболее впечатляющих особенностей The Jucer - редактору фоновой графики (см. рис. выше). Перейдем на вкладку Graphics. Здесь можно редактировать фон нашего компонента, отображаемый под виджетами. Из контекстного меню можно добавить различные геометрические примитивы, кривые, рисунки и текст. Для каждого компонента можно выбрать заливку цветом либо в виде линейного или радиального градиента, толщину и цвет линий и т.п. Контрольные точки градиентов и кривых можно перетаскивать мышью. Также можно задавать прозрачность для всех элементов, заполнять фигуры изображениями и даже преобразовывать текст в кривые. Редактор предельно понятен и очень приятен в работе. Его, конечно, нельзя сравнивать с полновесными векторными редакторами вроде Inkscape, но со своей функцией создания красивого фона для виджетов он справляется на отлично.
Код рисования помещается в метод paint() нашего класса и, при необходимости, в метод resized(). Изучив его, легко понять логику работы операций рисования в Juce. В частности, четко видно, как The Jucer берет на себя всю черную работу по масштабированию и размещению примитивов при изменении размеров окна.
The Jucer делает за программиста еще одну очень важную и не самую приятную работу - генерирует скелетный код для обработки событий всех компонентов, помещенных на форму. Для кнопок есть специальное свойство, которое позволяет включать или отключать создание такого кода для данной кнопки, но для всех остальных компонентов обработчики генерируются по умолчанию (где здесь логика - непонятно). Скелетный код для формы с двумя кнопками выглядит так:
В заголовочном файле автоматически добавляются необходимые наследуемые классы:
Таким образом, остается сосредоточиться на реальной логике программы и вписать между комментариями нужный код. Наличие «пустого» кода для событий всех компонентов безусловно загромождает текст программы, однако наличие готовых «пустышек» очень помогает в реальной работе: не нужно помнить, какой метод реализован, а какой - еще нет. Потому что все делается автоматически.
В следующей части статьи будут рассмотрены базовые классы Juce и подведены итоги.
Конечно же, Машинки Bruder (http://pogremuhka.ru/collection/Bruder) покажется Вам более интересными, чем Juce, особенно, если Вы не работаете в Linux. И именно поэтому я настоятельно рекомендую Вам посетить pogremuhka.ru, где Вы сможете приобрести эти замечательные игрушки!
1. Введение;
2. Используем The Jucer;
3. Вложенные компоновки;
4.
The Jucer позволяет очень просто и элегантно работать с любыми бинарными ресурсами. Предположим, мы хотим использовать в программе графический файл juce.png. Переходим на вкладку Resources и добавляем этот файл в список. При сохранении бинарные данные из этого файла переводятся в форму обычного массива С++ и непосредственно вставляются в код. Соответствующая строка имеет вид:
static const unsigned char
resource _ MyMainComponent _ juce _ png[] = { 137,80,78,71,...
resource _ MyMainComponent _ juce _ png[] = { 137,80,78,71,...
В классе автоматически создается переменная cachedlmage_ juce_png типа Image*, которая инициализируется данными этого массива в конструкторе. Ее можно использовать в коде для доступа к ресурсу. Весь служебный код для работы с такими ресурсами (а его немало) создается автоматически.
Имея набор графических файлов, загруженных в виде ресурсов, можно переходить к одной из наиболее впечатляющих особенностей The Jucer - редактору фоновой графики (см. рис. выше). Перейдем на вкладку Graphics. Здесь можно редактировать фон нашего компонента, отображаемый под виджетами. Из контекстного меню можно добавить различные геометрические примитивы, кривые, рисунки и текст. Для каждого компонента можно выбрать заливку цветом либо в виде линейного или радиального градиента, толщину и цвет линий и т.п. Контрольные точки градиентов и кривых можно перетаскивать мышью. Также можно задавать прозрачность для всех элементов, заполнять фигуры изображениями и даже преобразовывать текст в кривые. Редактор предельно понятен и очень приятен в работе. Его, конечно, нельзя сравнивать с полновесными векторными редакторами вроде Inkscape, но со своей функцией создания красивого фона для виджетов он справляется на отлично.
Код рисования помещается в метод paint() нашего класса и, при необходимости, в метод resized(). Изучив его, легко понять логику работы операций рисования в Juce. В частности, четко видно, как The Jucer берет на себя всю черную работу по масштабированию и размещению примитивов при изменении размеров окна.
Скелетный код обработчиков событий
The Jucer делает за программиста еще одну очень важную и не самую приятную работу - генерирует скелетный код для обработки событий всех компонентов, помещенных на форму. Для кнопок есть специальное свойство, которое позволяет включать или отключать создание такого кода для данной кнопки, но для всех остальных компонентов обработчики генерируются по умолчанию (где здесь логика - непонятно). Скелетный код для формы с двумя кнопками выглядит так:
void MyMainComponent: :buttonclicked (Button* buttonThatWasClicked) {
//[Userbuttonclicked _ Pre] //[/Userbuttonclicked _ Pre]
if (buttonThatWasClicked == textButton2) {
//[UserButtonCode _ textButton2] — add your button handler //code here..
//[/UserButtonCode _ textButton2]
}
else if (buttonThatWasClicked == textButton) {
//[UserButtonCode _ textButton] — add your button handler //code here..
//[/UserButtonCode _ textButton]
}
//[Userbuttonclicked _ Post] //[/Userbuttonclicked _ Post]
}
//[Userbuttonclicked _ Pre] //[/Userbuttonclicked _ Pre]
if (buttonThatWasClicked == textButton2) {
//[UserButtonCode _ textButton2] — add your button handler //code here..
//[/UserButtonCode _ textButton2]
}
else if (buttonThatWasClicked == textButton) {
//[UserButtonCode _ textButton] — add your button handler //code here..
//[/UserButtonCode _ textButton]
}
//[Userbuttonclicked _ Post] //[/Userbuttonclicked _ Post]
}
В заголовочном файле автоматически добавляются необходимые наследуемые классы:
class MyMainComponent :
public Component,
public SliderListener,
public ComboBoxListener,
public ButtonListener...
public Component,
public SliderListener,
public ComboBoxListener,
public ButtonListener...
Таким образом, остается сосредоточиться на реальной логике программы и вписать между комментариями нужный код. Наличие «пустого» кода для событий всех компонентов безусловно загромождает текст программы, однако наличие готовых «пустышек» очень помогает в реальной работе: не нужно помнить, какой метод реализован, а какой - еще нет. Потому что все делается автоматически.
В следующей части статьи будут рассмотрены базовые классы Juce и подведены итоги.
Конечно же, Машинки Bruder (http://pogremuhka.ru/collection/Bruder) покажется Вам более интересными, чем Juce, особенно, если Вы не работаете в Linux. И именно поэтому я настоятельно рекомендую Вам посетить pogremuhka.ru, где Вы сможете приобрести эти замечательные игрушки!