首页 > 其他分享 >【电子量产工具】4. UI系统

【电子量产工具】4. UI系统

时间:2023-09-07 14:35:02浏览次数:27  
标签:ptButton 量产 按钮 int ptRegion UI tRegion 工具 绘制

@TOC

前言

最近看了 电子量产工具 这个项目,本专栏是对该项目的一个总结。


一、UI界面分析

【电子量产工具】4. UI系统_UI

UI用户界面(User Interface)的缩写,指的是人与计算机或其他设备进行交互时所使用的界面。用户界面是用户与系统之间的桥梁,提供了一种方式让用户与计算机进行沟通、操作和获取信息。 用户界面可以包括以下几个方面:

  • 图形用户界面(GUI)。
  • 命令行界面(CLI)
  • 触摸界面
  • 声音界面
  • 虚拟现实界面(VR)和增强现实界面(AR)

我们的UI系统,就是构造各类GUI元素,比如按钮(目前只实现按钮)。

二、结构体描述按钮

/* 函数指针(绘制按键) */
typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);
/* 函数指针(按下按钮) */
typedef int (*ONPRESSED_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent);


typedef struct Button {
	char *name;								// 按键 名字
	int status;								//按键 按下状态
	Region tRegion;							// 按键的区域
	ONDRAW_FUNC OnDraw;						//一个 ONDRAW_FUNC 类型的函数指针,用于指向按钮绘制函数
	ONPRESSED_FUNC OnPressed;				//一个 ONPRESSED_FUNC 类型的函数指针,用于指向按钮按下事件处理函数
}Button, *PButton;
typedef struct Region {				//区域包括 左上角坐标, 高, 宽
	int iLeftUpX;
	int iLeftUpY;
	int iWidth;
	int iHeigh;
}Region, *PRegion;

三、按钮初始化

void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
{
	ptButton->status = 0;				//初始状态为 0 ,未按下
	ptButton->name = name;
	ptButton->tRegion = *ptRegion;			// 按钮的区域
	ptButton->OnDraw    = OnDraw ? OnDraw : DefaultOnDraw;		//若 OnDraw 为空,则执行默认绘制函数DefaultOnDraw
	ptButton->OnPressed = OnPressed ? OnPressed : DefaultOnPressed;	 //若 OnPressed 为空,则执行默认绘制函数DefaultOnPressed
}

四、默认绘制按键事件函数

绘制各个按钮 Button 的底色,文字,并将其刷新到 DispBuff 上

static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
{
	/* 绘制底色 */
	DrawRegion(&ptButton->tRegion, BUTTON_DEFAULT_COLOR);		// 红色 0xff0000

	/* 居中写文字 */
	DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);		//黑色 0x000000

	/* flush to lcd/web */
	FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);

	return 0;
}
  1. 绘制底色
void DrawRegion(PRegion ptRegion, unsigned int dwColor)
{
	int x = ptRegion->iLeftUpX;
	int y = ptRegion->iLeftUpY;
	int width = ptRegion->iWidth;
	int heigh = ptRegion->iHeigh;

	int i,j;

	for (j = y; j < y + heigh; j++)
	{
		for (i = x; i < x + width; i++)
			PutPixel(i, j, dwColor);			//描点函数
	}
}
  1. 居中写文字 在 一定的区域 Region,按颜色 dwColor 居中显示名字 name
void DrawTextInRegionCentral(char *name, PRegion ptRegion, unsigned int dwColor)
{
	int n = strlen(name);
	int iFontSize = ptRegion->iWidth / n / 2;
	FontBitMap tFontBitMap;

	int iOriginX, iOriginY;
	int i = 0;
	int error;

	if (iFontSize > ptRegion->iHeigh)				//计算字体大小
		iFontSize =  ptRegion->iHeigh;
		
	/* 当前文字的基点 */
	iOriginX = (ptRegion->iWidth - n * iFontSize)/2 + ptRegion->iLeftUpX;
	iOriginY = (ptRegion->iHeigh - iFontSize)/2 + iFontSize + ptRegion->iLeftUpY;

	SetFontSize(iFontSize);					// 设置字体大小

	while (name[i])			//字符编码
	{
		/* get bitmap */
		tFontBitMap.iCurOriginX = iOriginX;
		tFontBitMap.iCurOriginY = iOriginY;
		error = GetFontBitMap(name[i], &tFontBitMap);		//根据字符编码获取位图,保存在 参数 tFontBitMap中
		if (error)
		{
			printf("SelectAndInitFont err\n");
			return;
		}

		/* draw on buffer */		
		DrawFontBitMap(&tFontBitMap, dwColor);			// 绘制位图	

		iOriginX = tFontBitMap.iNextOriginX;			//获取下一文字的基点坐标
		iOriginY = tFontBitMap.iNextOriginY;	
		i++;
	}
}
  1. 将绘制到的按钮,刷新到 buffer 上。

返回 LCDframebuffer , 以后上层 APP 可以直接操作LCD, 可以不用 FbFlushRegion 也可以 malloc 返回一块无关的buffer, 要使用 FbFlushRegion

这里 为了 以后代码的可移植性,加上了刷新界面,但 并未做出任何举动。

【电子量产工具】4. UI系统_sed_02

五、默认按下按键事件函数

按下按键事件函数 也需要 上面 绘制函数 里的 : 绘制底色, 居中写文字 ,刷新界面。这里就不再 重述了。

static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
	unsigned int dwColor = BUTTON_DEFAULT_COLOR;		//按钮初始颜色 红色,0xff0000
	
	ptButton->status = !ptButton->status;				// 按钮状态,未按下时 为 0 
	if (ptButton->status)
		dwColor = BUTTON_PRESSED_COLOR;					//按下的颜色为 绿色, 0x00ff00

	/* 绘制底色 */
	DrawRegion(&ptButton->tRegion, dwColor);

	/* 居中写文字 */
	DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);

	/* 刷新界面 到 lcd/web */
	FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
	return 0;
}

六、测试程序

  1. 显示界面初始化
  2. 字体初始化
  3. ui 界面
/* 设置按钮的显示位置,宽高 */
	tRegion.iLeftUpX = 200;
	tRegion.iLeftUpY = 200;
	tRegion.iWidth   = 300;
	tRegion.iHeigh   = 100;
	
	/* 显示 "test", 调用默认绘制,按下函数 */
	InitButton(&tButton, "test", &tRegion, NULL, NULL);
	tButton.OnDraw(&tButton, ptBuffer);				//绘制按键
	while (1)
	{
		tButton.OnPressed(&tButton, ptBuffer, NULL);	//按下按键,
		sleep(2);		// 休眠 2 秒
	}

实验效果

实验结果就是每隔 2 秒,自动 变换按键的颜色。(我按钮后面的图是 自己的QT界面,忽略即可)

【电子量产工具】4. UI系统_函数指针_03

【电子量产工具】4. UI系统_UI_04


总结

UI 系统界面的逻辑性 不难,就是一些函数的编写有些困难。 这些封装好的代码,可以用于以后代码的一直调用。

标签:ptButton,量产,按钮,int,ptRegion,UI,tRegion,工具,绘制
From: https://blog.51cto.com/u_16159289/7396983

相关文章

  • buildroot 构建根文件系统(6)添加字体和中文支持
    一、开发背景构建最小系统后成功运行后,Qt程序在界面上文本不显示二、开发需求Qt库编译的程序可以正常运行三、开发环境LinuxUbuntu4.15.0-65-generic+buildroot-2023.02.3+i.mx6d(cortex-A9)四、实现步骤1、添加界面中文支持1)基于前面章......
  • Uchardet C++源码编译步骤 文本编码检测命令行工具 Command line
    从官网 https://www.freedesktop.org/wiki/Software/uchardet/下载源码 https://www.freedesktop.org/software/uchardet/releases/=====================================================================================下载编译工具:Cmake和mingw64https://cmake.org......
  • Stable Diffusion WebUI插件:StyleSelectorXL 之七十七种绘画风格任君选择
    本文给大家分享一个应用于SDXL的新插件:StyleSelectorXL。通过在UI界面上简单的选择,我们就可以生成多种多样的风格图片,如动漫、水彩、平面、3D、线稿、涂鸦、剪纸、朋克、童话等等。基本介绍用过SDXL的同学,应该能切身感受到其出图质量相比之前的SD1.5、2.x等版本都有了......
  • [论文阅读] Explicit Boundary Guided Semi-Push-Pull Contras
    ExplicitBoundaryGuidedSemi-Push-PullContrastiveLearningforSupervisedAnomalyDetectionIntroduction只关注正常样本可能会限制AD模型的可判别性。如图1(a)所示,在没有异常情况的情况下,决策边界通常是隐式的,没有足够的判别性。在无监督异常检测中,由于缺乏对异常的了解......
  • 好东西一起分享:ie下的js调试工具companion.js
          今天真是太高兴了,居然遇到这么个好东西。本来是采用多行文本域,可后来经理们开会后经过商量该字段用富文本编辑器来替换。       一来上班从cvs上同步下来,看到经理已经在一个页面替换过来了,采用不是fckeditor而是openeditor,第一次见到这个东西,不过感觉比fckedi......
  • 2023年值得推荐的 API 开发工具
    数字化时代,应用程序编程接口(API)的重要性愈发凸显。API充当着应用程序之间的桥梁,促进数据交换和功能集成。随着API的不断增加和复杂化,开发对API开发工具的要求也越来越高。我们一起来盘点下2023年上半年比较热门的API开发工具。API开发工具的主要作用API开发工具是一......
  • 干货贴|免费AI数据标注工具-多功能语音音频标注软件
    图像标注实际应用比较广泛,因此前几期我们分享了不少图像标注的内容,不过大家也有反馈希望对文本标注、语音标注有一些学习,小A那么宠粉,必须安排起来。工欲善其事,必先利其器。标注工具是数据标注行业的基础,一款好用的标注工具是提升标注效率与产出高质量标注数据的关键。之前我也分享......
  • 聚合类工具箱,吹爆这个软件
    日常工作和娱乐,都需要用到不同类型的软件,哪怕软件体积不大,也必须安装,否则到用时找不到就非常麻烦了。其实,很多软件不一定一样不剩地全部安装一遍,一方面原因是用的不多,另一方面多少有点占据内存。遇到类似的情况,小编推荐大家使用聚合类工具箱,软件体积不大,但功能多样,日用非常方便。最......
  • 十个最好的Java性能故障排除工具
    推荐十个最好的Java性能故障排除工具:  1.jconsole是随着JDK1.5而推出的。这是一个Java监测和管理控制台-JMX兼容的图形工具来监测Java虚拟机。它能够同时监测本地和远程的JVMs。详情可查看:jconsole工具介绍  2.VisualVM集成了几个现有的JDK软件工具,轻量级内存和CPU信息概......
  • 弹性数据库连接池探活策略调研(二)——Druid | 京东云技术团队
    前言在上一篇文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——Druid,并为您介绍如何在使用Druid时实现最佳实践的弹性数据库连接池探活策略。DruidDruid的版本迭代更新比较快,同时探活配置的......