UGUI:一个轻量级的TFTLCD彩色显示屏GUI库

目录

一、引言

二、移植说明

三、如何使用UGUI函数

2.1 UGUI函数介绍

2.2 窗口控件管理

2.3 如何建立一个按键

四、如何实现触摸控制


一、引言

UGUI是一个经过精心设计的轻量级TFT-LCD彩色显示屏GUI库,旨在为用户提供高效、稳定且易于使用的图形用户界面。该库采用先进的图形处理技术,能够实现高质量的图像显示和流畅的用户交互体验。同时,UGUI还提供了丰富的组件和工具,使用户能够轻松地创建各种类型的GUI界面,满足不同应用场景的需求。

二、移植说明

开源小型GUI系统,仅需ugui.c和ugui.h两个源文件,简洁高效。

最低硬件配置要求: 

1、在开始移植之前,请确保已准备好工程模板。

2、在https://github.com/achimdoebler/UGUI上下载开源文件,将ugui.c和ugui.h加入工程中;

3、构建下面三个函数,分别是画线、填充、画点函数,画点函数是最基本的,移植UGUI必须建立此函数。请注意,确认调用三个函数可以在显示屏正常显示。

UG_RESULT _HW_DrawLine( UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c );

UG_RESULT _HW_FillFrame( UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c );

这两个函数跟使用平台有关,用于快速画线、填充等,有些MCU可能不带图形快速处理,此例程基于stm32f4,STM32 专门定制了DMA2D 外设,它可用于快速绘制矩形、直线、分层数据混合、数据复制以及进行图像数据格式转换,可以把它理解为图形专用的 DMA。

4、初始化UGUI和注册快速画线、填充函数,使能对应函数。

恭喜你,至此移植完成,可以开始设计自己的GUI了。

三、如何使用UGUI函数

2.1 UGUI函数介绍

所有GUI函数说明可以参考官方手册Reference Guide ugui v0.3。

UGUI框架构成:

  1. 窗口:可以绘制多个窗口;
  2. 控件:支持窗口内显示其他控件如按钮、文本框等;
  3.  事件处理:支持界面和用户交互操作,事情回调,如触摸事件等;
  4.  接口函数:提供给开发者友好的接口。

例如建立一个窗口,如下图为显示效果:

注意此时只是简单的完成window1控件定义,LCD还未显示绘制窗口,要显示窗口必须在主循环或者定时中断中调用  UG_Update()

还有就是实现窗口内控件的回调点击处理函数,如下:

2.2 窗口控件管理

窗口控件管理:你在一个窗口中需要几个空间就要定义几个空间的相关类型变量定义,其中obj_buff[]数组用于记录你这个窗口中的空间,以数组方式管理和检索这些控件;一个窗口中可以容纳N个控件,由宏开关MAX_OBJECTS控制;

窗口中所有控件管理数组的初始化

 

2.3 如何建立一个按键

1、首先理解按键控件的属性结构体

2、创建自己的按键控件

a、首先从控件所在的窗口的控件管理数组中获得一个空闲的object元素来管理这个将要创建的button控件,并返回对应元素地址;

UG_OBJECT* obj  = _UG_GetFreeObject( wnd );

b、初始化按键控件自身的属性;

c、初始化管理对应控件的object数据属性;

d、注意创建按键控件的最后 obj->state &= ~OBJ_STATE_FREE;表示该数组元素已被占用,这个窗口需要创建别的控件时,需要在object数组中需要另一个空闲元素;如果空间多,你可以增加数组的长度,来管理更多的控件;

e、建立了窗口中的按键控件,最后需要对控件的内容和字体进行设置。

四、如何实现触摸控制

如下代码所示,先获取触摸坐标,然后确认触摸状态为按下,调用UG_TouchUpdate更新坐标信息,然后UG_Update()里面会处理触摸信息,按下的相关控件会调用回调函数处理,例如上面描述的回调函数window_1_callback,里面有判断是哪个控件按下,然后处理对应的函数。

UG_Update()其实主要做以下几件事情:

  1. 更新窗口;
  2. 更新窗口内的控件;
  3. 更新触摸事件,检测触摸屏是否按下,如果按下,检测哪个控件区域按下;
  4. 更新事件,即得到某个控件按下,然后调用对应的回调函数;

UG_Update()内部分代码:更新以上四个事情。

_UG_HandleEvents内部分代码,查询是否有事件发生,然后将消息压入消息结构体中,然后调入回调函数。

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

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

相关文章

邮件营销最佳时段:提升邮件打开率与转化率的策略

在如今数字时代,电子邮件营销已成为企业推广及与客户互动的有效途径。但是,一个普遍的现象是:何时发送电子邮件才能更合理?本文将探讨电子邮件营销的出色推送机会,并提供一些有用的提议,以帮助企业更好地规…

OrientDB使用教程:全面了解图数据库

图数据库在当今数据处理领域中扮演着越来越重要的角色,而OrientDB作为一种多模型的数据库,具有图数据库、文档数据库和对象数据库的特性,为应对不同场景提供了灵活的解决方案。本教程将简要介绍OrientDB的使用,包括基本概念、安装…

python subprocess run 和 Popen 的一些使用和注意事项

文章目录 一、run二、Popen NAME subprocess - Subprocesses with accessible I/O streams MODULE REFERENCE https://docs.python.org/3.9/library/subprocess The following documentation is automatically generated from the Python source files. It may be incomplete, …

QGraphicsItem器件移动及旋转相关问题

一、前言 Qt的图形视图框架中,可以使用如下接口设置图元坐标: void QGraphicsItem::setPos(const QPointF &pos)Sets the position of the item to pos, which is in parent coordinates. For items with no parent, pos is in scene coordinates.…

【数据结构】排序之插入排序

排序目录 1.前言2. 排序的概念及其运用2.1 排序的概念2.2 排序的运用2.3 常见的排序算法 3. 插入排序3.1 基本思想3.2 直接插入排序3.2.1 直接插入排序实现3.2.1.1 分析3.2.1.2 代码实现 3.3 希尔排序3.3.1 希尔排序实现3.3.1.1 分析3.3.1.2 代码实现 4. 附代码4.1 sort.h4.2 s…

Lumerical------按键中断程序执行

Lumerical------中断程序执行 引言正文 引言 在 Lumerical 中,很多时候我们需要通过 sweep 的方式来获取我们想要的结果,然而,有时候当我们运行程序后发现书写的脚本有问题时,我们想要强行终止程序的执行,该怎么办呢&…

K8s攻击案例:组件未授权访问导致集群入侵

K8s集群往往会因为组件的不安全配置存在未授权访问的情况,如果攻击者能够进行未授权访问,可能导致集群节点遭受入侵。比较常见的的组件未授权访问漏洞,主要包括 API Server 未授权访问、kubelet 未授权访问、etcd 未授权访问、kube-proxy 不安…

C++系列-第1章顺序结构-4-整型int

C系列-第1章顺序结构-4-整型int 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述整型int的用法 整型int 在C中,int 是一个关键字,用于声明整型变量。int 类型用于存储整数&…

01的token的年度总结

​ 大家好,我是token,一个热爱.NET的普通人,同样我来自湖南衡阳,再次之前我已经遇到非常多的湖南衡阳的老乡,比如李哥。 ​ 在这里一年中,我的成长也是非常迅速的,每一年的的每一天&#xff0c…

【Linux】深挖进程地址空间

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉【Linux】进程地址空间 > 毒鸡汤&#xff…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 为设计一个安全便捷,并且使用户更好获取本学院…

解决jenkins、git拉取代码仓库失败Please make sure you have the correct access rights

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

Redis主从

一、为何需要主从 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离 二、如何设置主从 有临时和永久两种模式: 修改配置文件(永久生效) 在redis.conf中添…

【23.12.29期--Spring篇】Spring的 IOC 介绍

介绍一下Spring的IOC ✔️引言✔️ lOC的优点✔️Spring的IOC✔️ 拓展知识仓✔️IOC是如何实现的? ✔️引言 所谓的IOC (inversion of control) ,就是控制反转的意思。何为控制反转? 在传统的程序设计中,应用程序代码通常控制着对象的创建和…

Typora使用PicGo+Gitee上传图片

Typora使用PicGoGitee上传图片 1.下载PicGo(国内镜像) https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/ 点击PicGo-Setup-2.3.0-x64.exe (64位安装) 然后打开gitee(没注册先注册) 2.下载node.js插件 https:/…

Android Camera

1. 相关的API Android有三套关于摄像头的API(库),分别是Camera、Camera2和CameraX,其中Camera已废弃,在Android5.0以后推荐使用Camera2和CameraX,Camera2推出是用来替换Camera的,它拥有丰富的API可以为复杂的用例提供…

算法与数据结构--二叉搜索树与自平衡二叉搜索树

0.字典(即c的map) 注:字典的 "member运算" 指的是检查字典中是否存在某个特定的键的操作,即查询操作。 如果我们使用数组来实现字典/map,虽然使用二分法查询也可以达到logn,但是的话插入和删除太…

SourceTree的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装:二、使用步骤1.获取地址2.放入sourceTree 3.点击推送 前言 提示:这里可以添加本文要记录的大概内容: 简单讲解一…

XV7001BB陀螺传感器

XV7001BB是一款工业级的高精度角度测量仪器,具备SPI或i2c串行接口,能够输出16位的角速率数据。同时,内置温度传感器可以实时监测环境温度,可选数字滤波器可以有效降低噪声干扰,使得测量结果更加准确可靠。作为一款低功…

Apache OFBiz 远程代码执行漏洞(CVE-2023-51467)

产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 漏洞概述 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外&…