当前位置:网站首页>电子产品量产工具(4)-UI系统实现
电子产品量产工具(4)-UI系统实现
2022-08-05 05:16:00 【乛 乛 .】
电子产品量产工具
4 UI系统设计

4.1 UI系统头文件front_manager.h
在头文件中抽象出结构体来描述按键的位置、大小信息以及被按下后的处理信息
4.1.1 按钮结构体Button
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; /*绘制按键*/
ONPRESSED_FUNC OnPressed;/*按键处理函数*/
}Button, *PButton;
4.1.2 front_manager.h完整代码
#ifndef _UI_H
#define _UI_H
#include <common.h>
#include <disp_manager.h>
#include <input_manager.h>
#define BUTTON_DEFAULT_COLOR 0xff0000
#define BUTTON_PRESSED_COLOR 0x00ff00
#define BUTTON_TEXT_COLOR 0x000000
struct Button;
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;
ONPRESSED_FUNC OnPressed;
}Button, *PButton;
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed);
#endif
4.2 按钮button.c
4.2.1 按钮初始化函数InitButton
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
{
ptButton->status = 0; /*按键状态*/
ptButton->name = name; /*按键名*/
ptButton->tRegion = *ptRegion; /*按键位置信息*/
ptButton->OnDraw = OnDraw ? OnDraw : DefaultOnDraw; /*若没有指定绘制函数,使用默认绘制函数*/
ptButton->OnPressed = OnPressed ? OnPressed : DefaultOnPressed; /*若没有指定按键处理函数,使用默认按键处理函数*/
}
4.2.2 默认绘制函数InitButton
绘制出长方形按钮
static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
{
/* 绘制底色 */
DrawRegion(&ptButton->tRegion, BUTTON_DEFAULT_COLOR);
/* 居中写文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
return 0;
}
4.2.3 默认按键处理函数InitButton
按下按键后按钮变色
static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
unsigned int dwColor = BUTTON_DEFAULT_COLOR;
ptButton->status = !ptButton->status;
if (ptButton->status)
dwColor = BUTTON_PRESSED_COLOR;
/* 绘制底色 */
DrawRegion(&ptButton->tRegion, dwColor);
/* 居中写文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
return 0;
}
4.2.4 button.c完整代码
#include <ui.h>
static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
{
/* 绘制底色 */
DrawRegion(&ptButton->tRegion, BUTTON_DEFAULT_COLOR);
/* 居中写文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
return 0;
}
static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
unsigned int dwColor = BUTTON_DEFAULT_COLOR;
ptButton->status = !ptButton->status;
if (ptButton->status)
dwColor = BUTTON_PRESSED_COLOR;
/* 绘制底色 */
DrawRegion(&ptButton->tRegion, dwColor);
/* 居中写文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
return 0;
}
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
{
ptButton->status = 0;
ptButton->name = name;
ptButton->tRegion = *ptRegion;
ptButton->OnDraw = OnDraw ? OnDraw : DefaultOnDraw;
ptButton->OnPressed = OnPressed ? OnPressed : DefaultOnPressed;
}
4.3 测试代码
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <disp_manager.h>
#include <font_manager.h>
#include <ui.h> /*包含必要头文件*/
int main(int argc, char **argv)
{
PDispBuff ptBuffer;
int error;
Button tButton;
Region tRegion;
if (argc != 2)
{
printf("Usage: %s <font_size>\n", argv[0]); //打印用法
return -1;
}
DisplayInit(); //显示系统初始化
SelectDefaultDisplay("fb"); //选择lcd设备显示
InitDefaultDisplay(); //初始化lcd设备显示
ptBuffer = GetDisplayBuffer();//获取内存
FontsRegister(); //字体注册
error = SelectAndInitFont("freetype", argv[1]);//字体大小设置
if (error)
{
printf("SelectAndInitFont err\n");
return -1;
}
/*指定按键形状、位置信息*/
tRegion.iLeftUpX = 200;
tRegion.iLeftUpY = 200;
tRegion.iWidth = 300;
tRegion.iHeigh = 100;
InitButton(&tButton, "yiyifufu", &tRegion, NULL, NULL); //按键初始化
tButton.OnDraw(&tButton, ptBuffer); //绘制案件即显示红色按钮与对应按键名
while (1) //按键按下颜色反转
{
tButton.OnPressed(&tButton, ptBuffer, NULL);
sleep(2);
}
return 0;
}
边栏推荐
- 沁恒MCU从EVT中提取文件建立MounRiver独立工程
- 盘点关于发顶会顶刊论文,你需要知道写作上的这些事情!
- 用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
- 【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
- CVPR2020 - 自校准卷积
- 【Promise高级用法】实现并行和串行API
- 【ts】typescript高阶:typeof使用
- 基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)
- 基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程
- tensorflow的session和内存溢出
猜你喜欢
随机推荐
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
《基于机器视觉的输电线路交叉点在线测量方法及技术方案》论文笔记
数控直流电源
CH32V307 LwIP移植使用
Polygon计算每一个角的角度
MySQL
[Database and SQL study notes] 8. Views in SQL
[Practice 1] Diabetes Genetic Risk Detection Challenge [IFLYTEK Open Platform]
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
吞吐?带宽?傻傻分不清楚
LeetCode刷题之第74题
idea 快速日志
对象比较
四、Web场景之静态资源配置原理
Redis设计与实现(第三部分):多机数据库的实现
网管日记:故障网络交换机快速替换方法
如何跟踪网络路由链路&检测网络健康状况
深度学习系列(一)简介、线性回归与成本函数
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
Kubernetes常备技能









