Одной из сторон создания пользовательского интерфейса в TouchGFX Designer является разработка реального интерфейса, имеющего правильные экраны, правильные виджеты, расположенные в нужных местах, чтобы все выглядело и чувствовалось правильно.

Другая сторона - это код, который на самом деле заканчивается вашей встроенной целью. Этот код должен быть настолько маленьким, простым, обслуживаемым и максимально эффективным, насколько это возможно. 
TouchGFX Designer автоматически генерирует код TouchGFX C ++ высочайшего качества.

В этой статье объясняется структура кода, сгенерированного дизайнером, и как вы можете расширить код и вставить свой собственный дополнительный код.

Отделить сгенерированный код от кода пользователя

Код, сгенерированный инструментом, будет полностью отделен от кода, написанного вами. Фактически сгенерированный код помещается в папку generated/gui_generated, тогда как рукописный код (который вы в конечном итоге обновите) находится в guiпапке.

Сгенерированный графический код служит базовыми классами для классов, к которым вы добавите код. Базовые классы содержат весь код настройки, настроенный в TouchGFX Designer. Диаграмма классов показывает взаимосвязь классов.

Уровни

Слой отображает 3 слоя кода, задействованные в приложении TouchGFX, созданном TouchGFX Designer.

  • Framework - эти классы являются стандартными классами, предоставляемыми TouchGFX. Они действуют как базовые классы для сгенерированных классов.
  • Сгенерировано - эти классы и соответствующие файлы будут обновляться всякий раз, когда вы вносите изменения в TouchGFX Designer. Поэтому вы не должны изменять какие-либо из этих классов и файлов вручную. Ваши изменения будут удалены при следующем запуске генератора кода. Эти классы являются базовыми классами для пользовательских классов.
  • Пользователь - эти классы предназначены для вашего кода. Вы можете поместить код, который вы хотите в них. Пользовательские классы будут сгенерированы, если они отсутствуют, но никогда не будут изменены TouchGFX Designer. Они ваши классы.

Открытая Архитектура

Архитектура приложений, сгенерированных Дизайнером, открыта в том смысле, что не должно быть никаких ограничений на то, что вы можете создать. Если что-то, например анимация или эффект, не поддерживается TouchGFX Designer или не легко сделать без доступа к коду, это возможно и легко сделать в пользовательских классах. 
Код, сгенерированный TouchGFX Designer, по своему замыслу не может ограничивать ваш способ работы с приложениями TouchGFX.

Пример

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

TouchGFX Designer View

Этот пример прост. У него только один экран. Экран My состоит из поля, изображения и кнопки. Мы настроили взаимодействие для вызова виртуальной функции button1Clicked при нажатии кнопки1.

пример

Всякий раз, когда мы нажимаем кнопку, мы хотели бы изменить цвет коробки. Такое поведение нельзя описать в TouchGFX Designer, поэтому мы сделаем это в коде.

Слои

Рассмотрим классы, задействованные в коде, сгенерированном для этого примера:

многоуровневый пример

Мы видим, что

  • MyViewBase, FrontendApplicationBase и FrontendHeapBase находятся в сгенерированном пространстве, подразумевая, что 
    • они будут обновляться всякий раз, когда в TouchGFX Designer вносятся изменения
    • Вы не должны вручную редактировать эти классы
  • MyView, MyPresenter, FrontendApplication и FrontendHeap создаются в пространстве кода пользователя 
    • они не будут восстановлены при внесении изменений в TouchGFX Designer
    • Вы можете добавить свой код здесь

Все настройки box1, image1 и button1 выполняются в сгенерированном базовом классе представления MyScreenViewBase. 
Все методы для перехода между экранами находятся в сгенерированном базовом классе приложения, FrontendApplicationBase. 
Весь бухгалтерский учет, обеспечивающий выделение нужного объема памяти, находится в сгенерированном базовом классе кучи, FrontendHeapBase.

Вы можете редактировать пользовательские классы. Например, вы можете добавить больше виджетов. Сейчас мы просто реализуем button1Clickedметод, чтобы фактически изменить цвет box1.

Код

Краткий обзор кода должен иллюстрировать разделение сгенерированного и пользовательского кода. Глядя на вид базового кода, мы видим все настройки окна, изображения и кнопки. Все сгенерировано TouchGFX Designer. Мы также видим настройку и вызов виртуального метода button1ClickedМы будем специализировать это в нашем собственном коде пользователя.

MyApplication / генерироваться / gui_generated / SRC / my_screen / MyViewBase.cpp

/*********************************************************************************/ /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/ /*********************************************************************************/ #include <gui_generated/my_screen/MyViewBase.hpp> #include <touchgfx/Color.hpp> #include "BitmapDatabase.hpp" MyViewBase::MyViewBase() : buttonCallback(this, &MyViewBase::buttonCallbackHandler) { box1.setPosition(0,0,800,480); box1.setColor(touchgfx::Color::getColorFrom24BitRGB(0,0,0)); image1.setBitmap(Bitmap(BITMAP_IMAGE_ID)); image1.setXY(40, 24); button1.setPosition(253, 210, 294, 61); button1.setBitmaps(Bitmap(BITMAP_UP_ID), Bitmap(BITMAP_DOWN_ID)); button1.setAction(buttonCallback); add(box1); add(image1); add(button1); } void MyViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src) { if (&src == &button1) { button1Clicked(); } }

В пользовательском коде мы реализуем метод нажатия кнопки, чтобы выполнить фактическое переключение цветов.

MyApplication / GUI / SRC / my_screen / MyView.cpp

#include <gui/my_screen/MyView.hpp> #include <touchgfx/Color.hpp> void MyView::button1Clicked() { box1.setColor(Color::getColorFrom24BitRGB(rand()&0xff, rand()&0xff, rand()&0xff)); box1.invalidate(); }

Добавив этот небольшой фрагмент пользовательского кода в MyView.cpp (и объявление в MyView.hpp), мы можем нажать кнопку и получить изменение цвета окна. Мы можем перейти к сгенерированному коду на диске и скомпилировать, как обычно, используя Make / GCC, Visual Studio или нашу предпочтительную IDE.

Катаюсь сам

Конечно, вам не нужно использовать какие-либо функции кода, созданного TouchGFX Designer. Вы можете сделать свое приложение классическим способом TouchGFX.

Или вы можете смешивать и сочетать.

У вас могут быть экраны, которые не определены в TouchGFX Designer. Вы можете добавить gotoXYZметоды в FrontendApplicationкласс и добавить представления, докладчиков и переходы, необходимые для вашего экрана FrontendHeap.