Для початку знайомства з Juce найзручніше згенерувати скелет мінімальної програми за допомогою «нового» Jucer. Запустимо його з extras / Jucer (experimental) / Builds / Linux / build. Виберемо File --gt; New Project ... і задамо тип Gui Application. Далі потрібно вибрати директорію для нового проекту. Неприємним глюком є те, що поки в поле File цього діалогу відображається ім`я поточної директорії (а воно з`являється там за замовчуванням), кнопка Open залишається недоступною. Тому, вибравши директорію, потрібно очистити поле File і натиснути Open. Далі задаємо ім`я проекту і вказуємо, що потрібно автоматично згенерувати Main.cpp і код для головного вікна. Наш скелетний код створений. У піддиректорії Builds містяться файли проектів для різних платформ, в тому числі і Makefile для Linux. У JuceLibraryCode поміщені файли, які посилаються на вихідні коди самої бібліотеки, а в Source - код нашої програми.
Перша компіляція може зайняти значний час, тому що компілюється по суті вся бібліотека, але наступні будуть проходити набагато швидше (див. рис. нижче).
Створення нового проекту в 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:
Клас головного вікна успадковується від DocumentWindow базова класу вікон в Juce. Ми відразу встановлюємо заго-спритний вікна, його колір і наявність кнопок мінімізації / закриття. В основній програмі ми не створювали екземпляр класу first_programApplication явно - це було зроблено автоматично всередині макросу. За допомогою статичного методу JUCEApplication :: getInstance () ми отримуємо посилання на цей екземпляр. У методі closeButtonPressed викликається метод основної програми systemRequestedQuit і запитується її закриття.
Легко помітити, що головне вікно не створюється при ініціалізації програми, тому вона поки що непрацездатна. Виправимо це:
class first _ programApplication: public JUCEApplication {public: MainAppWindow * 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 ();
Назва шрифту для використання методів інтуїтивно зрозумілі. Макрос Т (), як і в багатьох інших тулкіта, відповідає за інтернаціоналізацію додатки. Поки що від нього немає ніякої користі, але текстові константи, «загорнуті» в Т (), є хорошим стилем. Метод setBounds () задає положення, ширину і висоту віджета, а метод addAndMakeVisible () додає віджети в віджет-контейнер і відразу робить їх видимими.
Не будемо поки чіплятися до відверто непоказному увазі нашого вікна, а запитаємо себе, як обробити подія натискання на кнопку. Підхід, який використовується в Juce, досить оригінальний і не схожий на використовуваний в Qt або GTK +.
Ось і все, з Juce ми розібралися, а тепер давайте поговоримо про облік поштових відправлень (https://track-scanner.com/wiki/orders/). Виконання даного завдання слід довірити досвідченим фахівцям і професійного ПО. Track-Scanner.com, чия головна спеціалізація - інформаційна підтримка та захист інтернет магазинів, - ось ідеальний виконавець, який ідеально виконає поставлені вами перед ним завдання!