【TouchGFX实战】中文打印与滚动文本框

2023-05-16

TouchGFX实战——中文打印与滚动文本框

​ 本文涉及到的TouchGFX版本基于TouchGFX Designer 4.19.1,已成功应用到实际项目,如有疑问请向作者留言咨询。


​ 效果演示:
在这里插入图片描述

​ 整体效果如下,文本自动换行,滚动刷新。可以用来显示log、作串口上位机等应用。

常用文本方案

​ 在设计程序过程中,涉及到文本,我们通常会使用TouchGFX Designer的文本资源管理器功能,具体使用方法如下。

  • 在Typographies栏目中添加字体类型。
  • 在Texts中创建需要用到的文本,过程中可以选择上一步的字体类型。
  • 在程序中通过text.setTypedText(TypedText(RESOURCEID))来设置或切换显示文本。

实际操作如下:

​ 如图创建了一个名为chinese的文本字体,字体属性如右侧显示。

在这里插入图片描述

​ 再通过Texts创建一个文本,如下图为你好!欢迎使用TouchGFX,选用刚才创建的文本字体。

在这里插入图片描述

​ 创建控件并选择TextID显示。

在这里插入图片描述

​ 编写代码如下,实现定时文本切换。

void Screen1View::handleTickEvent()
{
    this->tickCounter++;
    static uint8_t change = 0;
    if (this->tickCounter % 50 == 0)
    {
        if (change)
        {
            change = 0;
            textArea1.setTypedText(TypedText(T_RESOURCEID2));
        }
        else
        {
			change = 1;
			textArea1.setTypedText(TypedText(T_RESOURCEID1));
        }
        textArea1.invalidate();
    }
}

​ 效果如下:

在这里插入图片描述

全文本显示

​ 以上我们尝试了通用的文本显示,那么我们如何不通过提前设置文本ID,像用printf一样打印和显示任何的中文文本呢?其实实现起来非常的方便,原理一样,可能存在的问题就是全文本显示比较占用嵌入式设备上的Flash大小。具体方法如下:

  • 更改Typographies栏目字体类型的包含范围
  • 调用显示

实际操作如下:

​ 首先我们需要知道TouchGFX使用的为Unicode编码,其使用两个字节代表一个中文字符,其具体的编码范围如下:

  • 汉字:[0x4e00,0x9fa5](或十进制[19968,40869])
  • 数字:[0x30,0x39](或十进制[48, 57])
  • 小写字母:[0x61,0x7a](或十进制[97, 122])
  • 大写字母:[0x41,0x5a](或十进制[65, 90])

​ 按照如上编码范围修改TouchGFX Designer的配置

在这里插入图片描述

Wildcard Characters:!”"#*%&()'$+-@_, .:;?/~±×÷•º`´{}©£€^®¥_=[]¡¢|\¿><【】;‘’,。、{}:“”《》?|·~!@#¥%……&*()——+
Wildcard Ranges:0x20-0x1BF,0X4e00-0X9f5a

​ 之后创建一个文本框,开启Wildcard1,合理设置Buffer大小。

在这里插入图片描述

​ 通过代码打印即可显示中文文本,注意需要将打印所在文本格式调成UTF8文本,可使用VS Code来重新编码保存,否则不能使用Unicode::fromUTF8来正常显示。

void Screen1View::handleTickEvent()
{
    tickCounter++;
    uint8_t str[128];
    if (tickCounter % 50 == 0)
    {
		static uint16_t textCount = 0;
		sprintf((char*)str, "你好TouchGFX:count %d\n", textCount++);
        this->TextAreaAddStr(str, sizeof(str));
    }
}

void Screen1View::TextAreaAddStr(uint8_t* str, uint32_t len)
{
	Unicode::fromUTF8(str, textArea1Buffer, len);
    textArea1.invalidate();
}

​ 效果如下:

在这里插入图片描述

自动换行与滚动显示

​ 当所打印字符超出文本框宽度时可能会出现显示不全的问题,这时候在invalidate之前调用官方api——text.setWideTextAction(WIDE_TEXT_CHARWRAP);即可实现自动换行。官方注释说明WIDE_TEXT_CHARWRAP适合中文换行所用,效果如下。

在这里插入图片描述

​ 当然,配合自动换行还有滚动显示可用,我们需要加入滚动窗口控件。

在这里插入图片描述

并且为了实现滚动效果,我们需要增大文本框的长度,如下图所示。

在这里插入图片描述

​ 接下来我们需要定义一个textBuf,来负责搬运,合成与滚动刷新判断,全部代码如下

  • 判断当窗口满时开始自动滚动窗口条
  • 判断当滚动条滚动到最后时,清空显示并将滚动条复位。
#include <gui/screen1_screen/Screen1View.hpp>
#include <texts/TextKeysAndLanguages.hpp>
#include <stdio.h>
#include <string.h>
Screen1View::Screen1View()
{

}

void Screen1View::setupScreen()
{
    Screen1ViewBase::setupScreen();
    this->bufSize = 4096;
	this->textBuf = (uint8_t*)malloc(this->bufSize);
	if (textBuf != NULL)
	{
		memset(textBuf, 0, this->bufSize);
	}
}

void Screen1View::tearDownScreen()
{
    Screen1ViewBase::tearDownScreen();
}
void Screen1View::handleTickEvent()
{
    tickCounter++;
    uint8_t str[128];
    if (tickCounter % 5 == 0)
    {
		static uint16_t textCount = 0;
		sprintf((char*)str, "TouchGFX: count %d 欢迎收藏我的博客www.pawn-ma.com \n", textCount++);
        this->TextAreaAddStr(str, sizeof(str));
    }
}

void Screen1View::TextAreaAddStr(uint8_t* str, uint32_t len)
{
	int16_t textHeight = 0, nowTextHeight = 0;
	static int16_t addHeigth = 0, addHeightsum = 0, scrollHeight = 0;
	nowTextHeight = textArea1.getTextHeight();
	textHeight = textArea1.getHeight();
	scrollHeight = scrollableContainer1.getHeight();
	/* buf is ready */
	if (textBuf == NULL || textArea1Buffer == NULL || len == 0)
		return;
	/* buf is full text is  on the bottom of scroll*/
	if (nowTextHeight > textHeight)
	{
		memset(textBuf, 0, this->bufSize);
		scrollableContainer1.doScroll(0, addHeightsum);
		addHeigth = 0;
		addHeightsum = 0;
		nowTextHeight = 0;
	}
	/* scroll the text */
	if (nowTextHeight > scrollHeight + addHeightsum)
	{
		addHeigth = scrollHeight + addHeightsum - nowTextHeight;
		addHeightsum = addHeightsum - addHeigth;
		scrollableContainer1.doScroll(0, addHeigth);
	}
	uint32_t lens = strlen((char*)textBuf);
	memcpy((char*)textBuf + lens, (char*)str, len);
	Unicode::fromUTF8(textBuf, textArea1Buffer, lens + len);
	textArea1.setWideTextAction(WIDE_TEXT_CHARWRAP);
	textArea1.invalidate();
}

​ 以上代码由于仿真条件,并未做太多的内存优化,并且此方法只是滚动显示的比较快捷实现的方法的一种。

​ 此方法存在效率低、内存占用大等缺点。不过用此方法实现滚动显示,在整屏清除前,支持历史回看,比较适合外带sdram的嵌入式设备。

实机效果

​ 实机效果如下所示,显示串口发来的任意数据,也算是一种有趣的玩法,用嵌入式调试嵌入式(dog…)。但是要注意一般上位机发送都是GBK编码,需要做编码转换。Fatfs文件系统中有相关的转换代码。

在这里插入图片描述

​ 稍加修饰就可以实现更多玩法。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【TouchGFX实战】中文打印与滚动文本框 的相关文章

  • C++中使用strtok函数分割字符串String

    C 43 43 中使用strtok函数分割字符串String string str getline cin str vector lt string gt vec char p 61 strtok char str c str 34 34
  • 利用python获取IP资源池的方法

    在使用爬虫的时候 xff0c 经常会遇到IP被禁止的情况 xff0c 所以一般都需要一个资源池来提高降低风险 以下代码中 xff0c 基于python3 7 xff0c 数据库用的是POSTGRESQL11 xff0c 为了效率使用了队列
  • DNS笔记(一):yum方式安装DNS与简单设置

    思路 客户端主机 gt DNS服务端主机 gt 后台主机 DNS服务端主机防火墙 iptables I INPUT 4 m state state NEW p tcp dport 53 j ACCEPT iptables I INPUT 4
  • Linux基础知识之df和du的差异

    创建文件前统计 xff0c 可以看出磁盘总共50G xff0c 已使用13G root 64 payne du sh 2 gt dev null 13G root 64 payne df h Filesystem Size Used Ava
  • Linux网络异常排查手段

    网络不通常用工具 xff1a ping mtr nmap telnet curl 域名IP服务器解析工具 xff1a nslookup dig 1 ping 启动方式及解释 xff1a ping c3 www baidu com PING
  • Prometheus学习(一):单节点部署与配置+Grafana安装

    Prometheus学习 xff08 一 xff09 xff1a 单节点部署与配置 43 Grafana安装 一 配置前准备1 下载软件2 主机列表3 同步时间4 创建账户 二 安装与配置1 node exporter安装与配置2 Serv
  • ELK笔记(一):Centos7部署elasticsearch-7.8.0集群

    Centos7部署elasticsearch 7 8 0集群 1 部署前准备1 1 系统选择1 2 主机列表1 3 下载 解压缩安装包1 4 创建用户 2 修改配置文件2 1 elastic search配置文件2 2 OS配置文件 3 启
  • centos8安装ansible-awx:9.0.1

    为什么要这要贴出来呢 xff0c 因为这个鬼东西我真的不知道为什么能跑成功 xff0c 先是在centos7上安装 xff0c 结果重复多次后成功了 xff0c 然后重新装一遍 xff0c 又失败了 真的不知道怎么装了 xff0c 甚至连在

随机推荐

  • 使用helm创建elastic

    coding https gitee com pangfaheng devops coding tree master kubernets elastic git https github com elastic helm charts 1
  • jstatd监控jvm内存消耗

    env localhost MacOS11 6 remote server run a centos7 server in vmware use MacOS monitoring remote server remote server op
  • 深度强化学习笔记之PPO算法理解(1)

    深度强化学习笔记之PPO算法理解 xff08 1 xff09 笔记内容来源于李宏毅老师的深度强化学习的PPT 关于PPO xff08 Proximal Policy Optimization xff09 xff0c 李老师分为了三个部分进行
  • apt install 报无法修正错误

    E 无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 很可能是ubuntu更换软件源出了问题 问题在于软件源设置不对 xff0c 装好Linux后 xff0c 人们都会去修改 etc ap
  • ubantu系统服务器系统搭建详情及配置步骤(DELL poweredge r730服务器)

    实验室新到了一批显卡 xff0c 周末跟着几位师兄在机房混迹学着ubantu系统系统服务的部署 xff0c 配置 xff0c 搭建 xff0c 现记录于博客备忘 准备 xff1a ubantu镜像文件 ubuntu 16 04 3 serv
  • 树莓派升级(安装)Python3.6

    如果你的树莓派或者其他Linux主机上安装的Python版本比较低 xff0c 那么在安装Homeassisant等软件时 xff0c 会出现一些故障导致无法安装 xff0c 所以本文讲解如何在python版本比较低的树莓派上升级树莓派的版
  • 研究了几天CEF的感受

    cef搞到现在 xff0c 用已经勉强用上了 xff0c 性能也很好 xff0c 但是最大的问题是js在render进程里跑 xff0c 这一点和Electron是一样的 xff0c 也是chrome这类浏览器标准做法 xff0c 其实是不
  • Jenkins安装过程

    一 什么是自动化测试平台 前言 xff1a 在一些做嵌入式产品的公司里 xff0c 为了确保开发主线代码的稳定 xff0c 在做版本升级的时候要考虑到代码改动对主线功能造成的影响 xff0c 避免造成严重的版本问题 xff0c 需要在每次代
  • ldd nm strip strings readelf file查看信息

    ldd lt 可执行文件名 gt 查看可执行文件链接了哪些 系统动态链接库 nm lt 可执行文件名 gt 查看可执行文件里面有哪些符号 strip lt 可执行文件名 gt 去除符号表可以给可执行文件瘦身 strip后使用nm查看不到符号
  • linux console输出重定向到串口ttyS0

    在linux系统中使用virsh创建和管理虚拟机时 xff0c 除了使用ssh 连接虚拟机 xff0c 还可以使用 virsh console 虚机名 的方式连接虚拟机 xff0c 不过需要在虚机镜像中开启将console重定向到串口的设置
  • 最新综述 | 图数据上的对抗攻击与防御

    Lichao Sun and Yingtong Dou and Carl Yang and Ji Wang and Philip S Yu and Bo Li Adversarial Attack and Defense on Graph
  • 记一次硬件调试经历

    产品信息 系统 xff1a SONiC系统 xff08 linux 4 9 110 xff09 xff0c ONIE xff08 4 1 38 xff09 项目背景 xff1a 此项目是一个网络流量设备 xff0c 作为流量转发器 xff0
  • VNC 的应用及灰屏鼠标变X问题

    Ubuntu中vnc服务器端的安装很简单 xff0c 运行如下命令 xff1a sudo apt get install vnc4server 第一次启动vncserver后 xff0c 在用户家目录中会生成 vnc 目录 xff0c 注意
  • 质量—弹簧—阻尼系统的建模分析

    质量 弹簧 阻尼系统的建模分析 本文介绍如何使用数轴建模法对质量 弹簧 阻尼系统进行建模分析 这里涉及的质量块 弹簧 阻尼均为理想器件 注 xff1a 实际弹簧还拥有阻尼器的效果 xff0c 即实际弹簧应该是一个弹簧 阻尼系统 在分析质量
  • ubuntu16.04上samba服务器的安装和配置

    大家好 xff0c 我是加摩斯 xff0c 觉得文章有帮助的小伙伴 xff0c 记得一键三连哟 xff5e 申明 xff1a 原创 xff0c 转载前请与我沟通 samba服务器的介绍可以查看鸟哥私房菜服务篇中的文件服务器之二 xff0c
  • 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

    答 xff1a 不对 xff0c 有相同的 hash code 这是java语言的定义 xff1a 1 对象相等则hashCode一定相等 xff1b 2 hashCode相等对象未必相等 hashCode 的常规协定是 xff1a 1 在
  • 关于下载Keil5无法打开keil4文件的问题解决方案

    关于下载Keil5无法打开keil4文件的问题解决方案 1 拖拽工程文件到keil4中 xff0c 发现相应问题2 打开工程目录 xff0c 删除缓存文件3 将uvproj文件拖到keil4程序上 本人在下载完keil4后下载了keil5
  • linux: flameshot 快捷键设置

    如果有一次启动后 xff0c 系统说 flameshot 崩溃了 xff0c 然后你的 快捷键 xff0c 就会不好用了 xff0c 那么此时 重启flameshot 即可
  • latex, 两个图并排怎么弄

    想要这样 的效果 俩图并排 xff0c 底下还有 一个 图的caption 你使用 如下 latex begin figure h subfloat label picd includegraphics width 61 6 77cm pi
  • 【TouchGFX实战】中文打印与滚动文本框

    TouchGFX实战 中文打印与滚动文本框 本文涉及到的TouchGFX版本基于TouchGFX Designer 4 19 1 xff0c 已成功应用到实际项目 xff0c 如有疑问请向作者留言咨询 效果演示 xff1a 整体效果如下 x