Новость из категории: Информация

Знакомство с Juce: первая программа

Содержание:
1. Введение;
2. Функциональность;
3. Установка;
4. Первая программа (Вы читаете данный раздел).
Знакомство с Juce: первая программа

Для начала знакомства с Juce удобнее всего сгенерировать скелет минимальной программы с помощью «нового» Jucer. Запустим его из extras/Jucer (experimental)/Builds/Linux/build. Выберем File --> New Project... и зададим тип Gui Application. Далее нужно выбрать директорию для нового проекта. Неприятным глюком является то, что пока в поле File этого диалога отображается имя текущей директории (а оно появляется там по умолчанию), кнопка Open остается недоступной. Поэтому, выбрав директорию, нужно очистить поле File и нажать Open. Далее задаем имя проекта и указываем, что нужно автоматически сгенерировать Main.cpp и код для главного окна. Наш скелетный код создан. В поддиректории Builds содержатся файлы проектов для разных платформ, в том числе и Makefile для Linux. В JuceLibraryCode помещены файлы, которые ссылаются на исходные коды самой библиотеки, а в Source - код нашей программы.

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

Знакомство с Juce: первая программа
Создание нового проекта в Jucer

Для начала разберемся в созданном коде для основной программы Main.cpp. Без пространных комментариев на английском он выглядит так:
#include ". ./JuceLibraryCode/JuceHeader.h"
class first _ programApplication : public JUCEApplication{ public:
// Ничего не делайте в конструкторе и деструкторе, // иначе все сломается! first _ programApplication() {} ~first _ programApplication() {}
void initialise (const Strings commandLine){ // Вся инициализация должна проходить здесь
}
void shutdown(){
// А вся очистка здесь
}
// Обработка системного запроса на завершение программы void systemRequestedQuit(){ quit();
}
// Несущественная часть кода опущена для краткости
};
// Этот макрос заменяет функцию main
START _ JUCE _ APPLICATION(first _ programApplication)

В целом, все должно быть понятно: мы наследуем базовый класс JUCEApplication и переопределяем методы для инициализации (initialise) и очистки (shutdown). В связи со спецификой дизайна библиотеки в самом конструкторе и деструкторе этого класса ничего делать нельзя, о чем предупреждают комментарии. Метод systemRequestedQuit вызывается тогда, когда программа получает запрос на закрытие. В частности, он будет вызывается при закрытии главного окна. Здесь можно, например, вывести предупреждение о несохраненных данных. Несколько пропущенных методов управляют поведением при запуске нескольких копий программы, и нам сейчас не интересны. Наконец, мы передаем наш класс макросу, который генерирует функцию main и запускает цикл обработки событий.

Посмотрим теперь на код главного окна MainWindow.cpp:
#include "MainWindow.h"
MainAppWindow::MainAppWindow() : DocumentWindow (
JUCEApplication: :getInstance()->getApplicationName(),
Colours: :lightgrey, DocumentWindow: :allButtons)
{
centreWithSize (500, 400); setVisible (true);
}
MainAppWindow: :~MainAppWindow() { }
void MainAppWindow::closeButtonPressed() {
JUCEApplication: :getInstance()->systemRequestedQuit();
}

Класс главного окна наследуется от DocumentWindow -базового класса окон в Juce. Мы сразу устанавливаем заго-ловок окна, его цвет и наличие кнопок минимизации/закрытия. В основной программе мы не создавали экземпляр класса first_programApplication явно - это было сделано автоматически внутри макроса. С помощью статического метода JUCEApplication::getInstance() мы получаем ссылку на этот экземпляр. В методе closeButtonPressed вызывается метод основной программы systemRequestedQuit и запрашивается ее закрытие.

Легко заметить, что главное окно не создается при инициализации программы, поэтому она пока что не работоспособна. Исправим это:
class first _ programApplication : public JUCEApplication { public:
MainAppWindow* w;
void initialise (const Strings commandLine) { w = new MainAppWindow();
}
void shutdown() { if(w) delete w;
}

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

Мы получили простейшую работающую программу на Juce, отображающую пустое серое окно, которое может сворачиваться и закрываться, но не может менять размер. Добавив в конструктор MainAppWindow вызов setResizable(true,true), мы получим и эту возможность.

Добавляем виджеты

В Juce можно рисовать и размещать виджеты не только в клиентской области, но и на заголовке окна, что, как правило, совершенно нежелательно. Поэтому для того, чтобы добавить в наше окно какие-то виджеты, нужно получить доступ к клиентской части окна. Сначала нужно создать виджет-контейнер и установить его в клиентскую область:
// В объявлении класса MainAppWindow
Component* content;
--
// В конструкторе MainAppWindow
content = new Component();
setContentComponent(content);

Теперь в content можно добавлять другие виджеты. Добавим два окна редактирования и кнопку:
// В объявлении класса
MainAppWindow TextButton* result;
TextEditor* editl;
TextEditor* edit2;
// В конструкторе
MainAppWindow result = new TextButton (T("Результат"));
edit1 = new TextEditor();
edit2 = new TextEditor();

content->addAndMakeVisible (result);
content->addAndMakeVisible (edit1);
content->addAndMakeVisible (edit2);

edit1->setBounds (10, 10, 150, 20);
edit2->setBounds (10, 50, 150, 20);
result->setBounds (10, 100, 150, 30)

Имена используемых методов интуитивно понятны. Макрос Т(), как и во многих других тулкитах, отвечает за интернационализацию приложения. Пока что от него нет никакой пользы, но текстовые константы, «обернутые» в Т(), являются хорошим стилем. Метод setBounds() задает положение, ширину и высоту виджета, а метод addAndMakeVisible() добавляет виджеты в виджет-контейнер и сразу делает их видимыми.

Не будем пока придираться к откровенно неказистому виду нашего окна, а зададимся вопросом, как обработать событие нажатия на кнопку. Подход, используемый в Juce, довольно оригинален и не похож на используемый в Qt или GTK+.



Вот и все, с Juce мы разобрались, а теперь давайте поговорим про учет почтовых отправлений (http://track-scanner.com/wiki/orders/). Выполнение данной задачи следует доверить опытным специалистам и профессиональному ПО. Track-Scanner.com, чья главная специализация - информационная поддержка и защита интернет магазинов, - вот идеальный исполнитель, который идеально выполнит поставленные вами перед ним задачи!

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх