TouchGFX界面开发 | 项目代码结构分析

项目代码结构分析

本文介绍TouchGFX项目中TouchGFX Designer自动生成的代码,以及需要用户编写的扩展代码。

一、生成的代码和用户代码

TouchGFX Designer生成的代码将与用户编写的代码完全分离。 事实上,自动生成的代码位于generated/gui_generated文件夹中,而手写代码位于gui文件夹中。

gui_generated代码充当用户代码类的基类。 基类包含在TouchGFX Designer中配置的所有设置代码。 下图显示了引擎类、生成类和用户类的类层次结构:

在这里插入图片描述

如上图所示,TouchGFX Designer应用包含3个不同代码层:

  • 引擎:是TouchGFX提供的标准类,充当生成类的基类
  • 生成:自动生成的类和相应文件。不应手动编辑这些类和文件,因为任何手动修改都会在下一次运行代码生成器时被重写。这些类是用户类的基类
  • 用户:这些类预定供手写代码使用。用户可以自由地将任何代码放入该层。 若没有用户类,将生成用户类,且永远不会被TouchGFX Designer修改。它们属于用户

二、TouchGFX Designer生成的文件

TouchGFX Designer将只在TouchGFX项目的generated文件夹中重新生成文件,因此不得在该文件进行手动编辑,因为会被覆盖。 然而,TouchGFX设计器也可以生成编译所需的缺失文件,例如application.configsimulator/main.cpp 、皮肤图片(位于assets/images/__designer中)、以及示例视频(位于 assets/videos/__designer中)。事实上,TouchGFX Designer只需要下列文件就能生成、编译和运行项目:

  • 描述项目的.touchgfx文件
  • 位于gui文件夹的用户代码
  • 位于assets/images文件夹的用户图像
  • assets/texts/texts.xml文件中的文本
  • 位于assets/fonts文件夹的字体
  • assets/videos文件夹中的视频

在使用版本控制(如Git)时,这意味着实际上只需要将上面列出的文件提交到存储库。 其余的由TouchGFX Designer自己生成。

三、应用示例

下面是一个同时拥有生成代码和用户代码的应用的简单示例。 该示例能更详细地说明以上情况。

3.1 TouchGFX Designer视图

下面的示例只有一个屏幕。 屏幕MyScreen包含一个方框box1和一个按钮button1。 我们设置了在点击button1时调用虚函数setRandomColor()的交互
在这里插入图片描述

当按下按钮时,我们想要让背景框的颜色变为新的随机色。 为了演示如何编写您自己的自定义代码,我们将在用户代码中实现此行为。

下面是该示例中涉及的不同类:
在这里插入图片描述

如上图所示,我们可以看到:

  • MyScreenViewBaseFrontendApplicationBaseFrontendHeapBase位于生成空间,这表明:

– 在TouchGFX Designer中执行更改时,会重新生成这些类
– 用户不应手动编辑这些类

  • MyScreenViewMyScreenPresenterFrontendApplicationFrontendHeap是在用户代码中创建的,这表明:

– 在TouchGFX Designer中执行更改时,不会重新生成这些类。
– 用户可以在这里自由地添加自定义代码

  • box1和button1的所有设置都在生成的视图基类MyScreenViewBase中完成
  • 用于屏幕之间过渡的所有函数都位于生成的应用基类FrontendApplicationBase中
  • 用于确保分配了适量存储空间的所有记帐均位于生成的堆基类FrontendHeapBase中

用户可以自由地编辑用户代码类。 例如,您可以添加更多小工具。 目前,我们只实现setRandomColor函数来实际更改box1的颜色。

3.2 生成代码

在视图基础代码中,可以看到TouchGFX Designer生成的方框和按钮设置。 我们还看到了buttonCallbackHandler中虚函数setRandomColor的设置和调用,但此刻该函数还没有任何操作:

// MyApplication/generated/gui_generated/src/my_screen/MyScreenViewBase.cpp
/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#include <gui_generated/myscreen_screen/MyScreenViewBase.hpp>
#include <touchgfx/Color.hpp>
#include "BitmapDatabase.hpp"MyScreenViewBase::MyScreenViewBase() :buttonCallback(this, &MyScreenViewBase::buttonCallbackHandler)
{box1.setPosition(0, 0, 800, 480);box1.setColor(touchgfx::Color::getColorFromRGB(255, 255, 255));button1.setXY(155, 106);button1.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));button1.setAction(buttonCallback);add(box1);add(button1);
}void MyScreenViewBase::setupScreen()
{}void MyScreenViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
{if (&src == &button1){//Interaction1//When button1 clicked call virtual function//Call setRandomColorsetRandomColor();}
}

在视图基类的头文件中,我们看到了setRandomColor的声明和重写并实现用户代码中函数的指令:

// MyApplication/generated/gui_generated/src/my_screen/MyScreenViewBase.hpp
/*********************************************************************************/
/********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
/*********************************************************************************/
#ifndef MYSCREENVIEWBASE_HPP
#define MYSCREENVIEWBASE_HPP#include <gui/common/FrontendApplication.hpp>
#include <mvp/View.hpp>
#include <gui/myscreen_screen/MyScreenPresenter.hpp>
#include <touchgfx/widgets/Box.hpp>
#include <touchgfx/widgets/Button.hpp>class MyScreenViewBase : public touchgfx::View<MyScreenPresenter>
{
public:MyScreenViewBase();virtual ~MyScreenViewBase() {}virtual void setupScreen();/** Virtual Action Handlers*/virtual void setRandomColor(){// Override and implement this function in MyScreen}protected:FrontendApplication& application() {return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());}/** Member Declarations*/touchgfx::Box box1;touchgfx::Button button1;private:/** Callback Declarations*/touchgfx::Callback<MyScreenViewBase, const touchgfx::AbstractButton&> buttonCallback;/** Callback Handler Declarations*/void buttonCallbackHandler(const touchgfx::AbstractButton& src);};#endif // MYSCREENVIEWBASE_HPP
3.3 用户代码

下面是需要用户手写的代码。 在用户代码头文件MyScreenView.hpp中重写函数:

// MyApplication/generated/gui_generated/src/my_screen/MyScreenView.hpp
#ifndef MYSCREENVIEW_HPP
#define MYSCREENVIEW_HPP#include <gui_generated/myscreen_screen/MyScreenViewBase.hpp>
#include <gui/myscreen_screen/MyScreenPresenter.hpp>class MyScreenView : public MyScreenViewBase
{
public:MyScreenView();virtual ~MyScreenView() {}virtual void setupScreen();virtual void tearDownScreen();virtual void setRandomColor();
protected:
};#endif // MYSCREENVIEW_HPP

然后,需要在·MyScreenView的cpp·文件中实现·setRandomColor·的实际行为:

// MyApplication/gui/src/my_screen/MyScreenView.cpp
#include <gui/myscreen_screen/MyScreenView.hpp>
#include <touchgfx/Color.hpp>
#include <stdlib.h>MyScreenView::MyScreenView()
{}void MyScreenView::setupScreen()
{MyScreenViewBase::setupScreen();
}void MyScreenView::tearDownScreen()
{MyScreenViewBase::tearDownScreen();
}void MyScreenView::setRandomColor()
{box1.setColor(touchgfx::Color::getColorFromRGB(rand()&0xff, rand()&0xff, rand()&0xff));box1.invalidate();
}

运行模拟器,结果显示我们已成功利用生成代码和用户代码创建了一个简单应用:每次点击按钮时,背景框都会变为随机色

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国零售电商平台Target,值得入驻吗?如何入驻?

Target 是美国最大的零售商之一&#xff0c;在品牌出海为大势所趋的背景下&#xff0c;它在北美电商中的地位节节攀升。Target 商店在众多垂直领域提供各种价格实惠的自有品牌&#xff0c;吸引越来越多的跨境商家入驻&#xff0c;如美妆、家居、鞋服、日用百货等&#xff0c;随…

【kubernetes】使用virtual-kubelet扩展k8s

1 何为virtual-kubelet&#xff1f; kubelet是k8s的agent&#xff0c;负责监听Pod的调度情况&#xff0c;并运行Pod。而virtual-kubelet不是真实跑在宿主机上的&#xff0c;而是一个可以跑在任何地方的进程&#xff0c;该进程向k8s伪装成一个真实的Node&#xff0c;但是实际的…

QT运行错误设置弹窗提示

在Qt中,您可以使用QMessageBox类来弹出警告信息框。QMessageBox类提供了多种类型的弹出框,包括警告框、信息框、询问框等。以下是一个简单的示例,演示如何弹出一个警告信息框: #include <QApplication> #include <QMessageBox>int main(int argc, char *argv[…

Goby 漏洞发布|Cockpit 平台 upload 文件上传漏洞(CVE-2023-1313)

漏洞名称&#xff1a;Cockpit 平台 upload 文件上传漏洞&#xff08;CVE-2023-1313&#xff09; English Name&#xff1a; Cockpit File Upload Vulnerability(CVE-2023-1313) CVSS core:7.2 影响资产数&#xff1a;3185 漏洞描述&#xff1a; Cockpit 是一个自托管、灵活…

MATLAB m文件格式化

记录一个网上查到的目前感觉挺好用的格式化方法。 原链接&#xff1a; https://cloud.tencent.com/developer/article/2058259 压缩包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZpQ9qGLY7sjcvxzjMPAitw?pwd6666 提取码&#xff1a;6666 下载压缩包&#xf…

Abdroid - 开机动画修改

安卓都有开机动画 从安卓4.0或者更早截止到目前的安卓13版本。安卓开机顺序简单的来说就是开机第一屏---开机动画---进入系统桌面的步骤。相比开机第一屏来说。开机动画的修改就比较简单。因为所有的开机动画基本格式百分90都是相同的。区别就在于其中的图片分辨率和加载的脚本…

SpringBoot之Web原生组件注入

文章目录 前言一、原生注解方式注入二、Spring方式注入三、切换web服务器与定制化总结 前言 注入Web原生Servlet、Filter、Listeber以及切换Web服务器。 一、原生注解方式注入 官方文档 - Servlets, Filters, and listeners Servlet注入&#xff1a; WebServlet(urlPattern…

插入排序与希尔排序

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 这两个排序在思路上有些相似&#xff0c;所以有人觉得插入排序和希尔排序差别不大&#xff0c;事实上&#xff0c;他们之间的差别不小&#xff0c;插入排序只是希尔排序的最后一步。 目录 前言&#xff1a;…

DevSecOps 将会嵌入 DevOps

通常人们在一个项目行将结束时才会考虑到安全&#xff0c;这么做会导致很多问题&#xff1b;将安全融入到DevOps的工作流中已产生了积极结果。 DevSecOps&#xff1a;安全正当时 一直以来&#xff0c;开发人员在构建软件时认为功能需求优先于安全。虽然安全编码实践起着重要作…

套接字socket编程的基础知识点

目录 前言&#xff08;必读&#xff09; 网络字节序 网络中的大小端问题 为什么网络字节序采用的是大端而不是小端&#xff1f; 网络字节序与主机字节序之间的转换 字符串IP和整数IP 整数IP存在的意义 字符串IP和整数IP相互转换的方式 inet_addr函数&#xff08;会自…

LINUX|ubuntu常用指令

文章目录 查看IP显示当前路径下所有文件安装编译工具GCC、调试工具GDB、连接工具SSHmkdir 创建目录export命令显示当前系统定义的所有环境变量echo $PATH命令输出当前的PATH环境变量的值当前命令行添加环境变量&#xff0c;关闭失效&#xff0c;防止多版本库冲突时使用sudo su打…

【JAVA】飞机大战

代码和图片放在这个地址了&#xff1a; https://gitee.com/r77683962/fighting/tree/master 最新的代码运行&#xff0c;可以有两架飞机&#xff0c;分别通过WASD&#xff08;方向&#xff09;&#xff0c;F&#xff08;发子弹&#xff09;&#xff1b;上下左右&#xff08;控…

Xcode 15 运行<iOS 14, 启动崩溃问题

如题. Xcode 15 启动 < iOS 14(没具体验证过, 我的问题设备是iOS 13.7)真机设备 出现启动崩溃 解决方案: Build Settings -> Other Linker Flags -> Add -> -ld64

1043 输出PATest

description 给定一个长度不超过 10 ^4 的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按 PATestPATest… 这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;六种字符的个数不一定是一样多的&#xff0c;若某种字符已经输出完&#xff0c;则余下…

EGL函数翻译--eglGetDispaly

EGL函数翻译–eglGetDispaly 函数名 EGLDisplay eglGetDisplay(NativeDisplayType native_display); 参数描述 native_display:指定要连接的显示器&#xff0c;多个显示器有不同native_display。默认使用EGL_DEFAULT_DISPLAY 。 详细描述 eglGetDisplay输入一个本地显示器I…

如何查看自己电脑IP和端口

文章目录 一、查看IP的指令&#xff1a;二、查看端口的指令&#xff1a;三、如何机房电脑老师的控制四、vscode缩进快捷键 一、查看IP的指令&#xff1a; ipconfig 二、查看端口的指令&#xff1a; netstat 三、如何机房电脑老师的控制 先决条件&#xff1a;要能使用ctrlt…

标题:探寻电大搜题,广东开放大学的智慧之旅

随着信息技术的快速发展和互联网的普及&#xff0c;越来越多的人开始选择通过电大学习。作为知名的广东开放大学&#xff0c;一直致力于提供高质量的教育资源&#xff0c;让更多人实现自己的梦想。在这个过程中&#xff0c;电大搜题微信公众号成为了学生们的得力助手&#xff0…

【前端打怪升级日志之ES6篇】玩转函数

学习资料 阮一峰老师《ECMAScript 6 入门》— 函数的扩展 总结应用 1. 函数参数默认值与对象解构赋值默认值的结合使用 // 场景&#xff1a;方法调用时传参希望只传第二个参数 // 方案1&#xff1a; function foo({x1,y2}){console.log(x,y); } foo({}) //1 2 foo({x:2}) /…

Java技术接单

今天给大家介绍一个阶段性&#xff08;周期性&#xff09;能获取一定收益的Java技术接单群&#xff0c;分享给大家&#xff01;主要对搞Java的粉丝有帮助&#xff0c;因为可以赚点小钱&#xff0c;对Java技术的要求不高&#xff01; 注意&#xff1a;首先进群不是免费的&#…

PHP8的静态变量和方法-PHP8知识详解

我们在上一课程讲到了public、private、protected这3个关键字&#xff0c;今天我们来讲解static关键字&#xff0c;明天再讲解final关键字。 如果不想通过创建对象来调用变量或方法&#xff0c;则可以将该变量或方法创建为静态变量或方法&#xff0c;也就是在变量或方法的前面…