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;但是实际的…

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都是相同的。区别就在于其中的图片分辨率和加载的脚本…

插入排序与希尔排序

个人主页&#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

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

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

Java技术接单

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

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

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

Flink窗口

窗口&#xff08;Window&#xff09; package com.atguigu.window;import com.atguigu.bean.WaterSensor; import com.atguigu.functions.WaterSensorMapFunction; import org.apache.flink.streaming.api.datastream.KeyedStream; import org.apache.flink.streaming.api.dat…

php框架thinkPHP6的安装教程

1&#xff0c;composer官网下载最新版本 composerhttps://getcomposer.org/download/ 2&#xff0c;双击下载后的运行文件&#xff0c;一直点击next就行了 上面这个路径根据自己安装的php版本位置选择&#xff08;没有的可以下载一个phpstudy&#xff09;&#xff0c;最后需要…

2023 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|数学建模完整代码+建模过程全解全析

F题代码思路 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们一起看看研赛的F题呀&#xff01;全文都已…

【笔记】离线Ubuntu20.04+mysql 5.7.36 + xtrabackup定时增量备份脚本

一、环境 ● Ubuntu版本查看 lsb_release -a● mysql 版本查看 mysql --version我的是ubuntu 20.04&#xff0c;mysql是5.7.36&#xff0c;所以要用 install_percona-xtrabackup-24 二、原理 备份 通过ubuntu自带的定时器运行增量备份脚本备份文件可以存储在映射后的其他…

23 mysql index 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

Linux学习第22天:Linux中断驱动开发(一): 突如其来

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中断作为驱动开发中很重要的一个概念&#xff0c;在实际的项目实践中经常用到。本节的主要内容包括中断简介、硬件原理分析、驱动程序开发及运行测试。其中驱动程…