多分辨率 LCD 的 GUI 架构设计与实现

1.1多分辨率显示系统的挑战与解决方案

1.1.1 分辨率适配的核心问题

在嵌入式系统中,同时支持不同分辨率的 LCD(如 240×160、320×480 等)面临以下挑战:

布局适配:同一界面元素在不同分辨率下需要调整大小和位置

字体显示:小分辨率屏幕需要更小的字体,而大分辨率需要更清晰的字体

内存占用:高分辨率屏幕需要更多显存,而低分辨率需要优化内存使用

渲染性能:高分辨率屏幕渲染压力更大,需要优化渲染算法

针对这些问题, 采用以下解决方案:

抽象显示接口:定义统一的显示操作接口,屏蔽底层硬件差异

相对布局系统:使用百分比或相对单位定义界面元素位置和大小

字体动态缩放:根据屏幕分辨率动态调整字体大小

资源按需加载:根据当前屏幕分辨率选择合适的图片和字体资源

1.1.2 单色屏与彩屏的兼容性设计

同时支持单色屏和彩屏时,需要解决以下问题:

颜色表示:单色屏只有黑白两色,而彩屏支持多种颜色

图形渲染:彩屏支持渐变、阴影等复杂效果,单色屏需要简化

交互反馈:彩屏可通过颜色变化提供反馈,单色屏需依赖对比度或闪烁

解决方案包括:

颜色抽象层:定义颜色映射表,将 RGB 颜色映射到单色屏的黑白值

渲染策略分离:为单色屏和彩屏分别实现不同的渲染算法

交互反馈统一:使用统一的交互反馈接口,底层根据屏幕类型实现

1.2 统一显示抽象层设计

1.2.1 显示接口定义

我们首先定义一个抽象的显示接口,屏蔽不同分辨率和类型的 LCD 差异:

c

/**

 * 显示抽象层接口定义

 * 支持不同分辨率和类型的LCD

 */

#ifndef DISPLAY_ABSTRACTION_H

#define DISPLAY_ABSTRACTION_H

#include <stdint.h>

#include <stdbool.h>

/* 颜色定义 - 采用RGB565格式 */

typedef uint16_t color_t;

/* 标准颜色常量 */

#define COLOR_BLACK       0x0000

#define COLOR_WHITE       0xFFFF

#define COLOR_RED         0xF800

#define COLOR_GREEN       0x07E0

#define COLOR_BLUE        0x001F

#define COLOR_YELLOW      0xFFE0

#define COLOR_CYAN        0x07FF

#define COLOR_MAGENTA     0xF81F

/* 显示区域结构体 */

typedef struct

{

    uint16_t x;

    uint16_t y;

    uint16_t width;

    uint16_t height;

} rect_t;

/* 显示设备能力结构体 */

typedef struct

{

    uint16_t width;              /* 屏幕宽度 */

    uint16_t height;             /* 屏幕高度 */

    uint8_t bits_per_pixel;      /* 每像素位数 */

    bool color_support;          /* 是否支持彩色 */

    uint16_t max_font_size;      /* 最大支持字体大小 */

    uint16_t min_font_size;      /* 最小支持字体大小 */

} display_capabilities_t;

/* 显示接口函数指针结构体 */

typedef struct

{

    /* 基本操作 */

    void (*init)(void);

    void (*clear)(color_t color);

    void (*refresh)(void);

   

    /* 绘制基本图形 */

    void (*draw_pixel)(uint16_t x, uint16_t y, color_t color);

    void (*draw_line)(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color);

    void (*draw_rect)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, color_t color);

    void (*fill_rect)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, color_t color);

    void (*draw_circle)(uint16_t x, uint16_t y, uint16_t radius, color_t color);

    void (*fill_circle)(uint16_t x, uint16_t y, uint16_t radius, color_t color);

   

    /* 文本绘制 */

    void (*set_font_size)(uint8_t size);

    void (*set_text_color)(color_t color, color_t background);

    void (*draw_char)(uint16_t x, uint16_t y, char c);

    void (*draw_string)(uint16_t x, uint16_t y, const char* str);

   

    /* 图像绘制 */

    void (*draw_image)(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* data);

   

    /* 获取显示能力 */

    void (*get_capabilities)(display_capabilities_t* caps);

} display_interface_t;

/* 获取当前显示接口实例 */

display_interface_t* get_display_interface(void);

/* 设置当前显示接口实例 */

void set_display_interface(display_interface_t* display);

#endif /* DISPLAY_ABSTRACTION_H */

1.2.2 显示接口实现

下面是显示接口的基础实现,提供了统一的操作入口:

/**

 * 显示抽象层实现

 */

#include "display_abstraction.h"

/* 当前显示接口实例 */

static display_interface_t* current_display = NULL;

/* 获取当前显示接口实例 */

display_interface_t* get_display_interface(void)

{

    return current_display;

}

/* 设置当前显示接口实例 */

void set_display_interface(display_interface_t* display)

{

    current_display = display;

}

/* 通用绘制函数 - 使用当前显示接口 */

void display_clear(color_t color)

{

    if (current_display && current_display->clear)

    {

        current_display->clear(color);

    }

}

void display_refresh(void)

{

    if (current_display && current_display->refresh)

    {

        current_display->refresh();

    }

}

void display_draw_pixel(uint16_t x, uint16_t y, color_t color)

{

    if (current_display && current_display->draw_pixel)

    {

        current_display->draw_pixel(x, y, color);

    }

}

// 其他通用绘制函数实现...

1.3 相对布局系统设计

1.3.1 布局管理器设计

为了实现跨分辨率的 GUI 适配,我们设计一个相对布局管理器:


 

/**

 * 相对布局管理器

 * 支持基于百分比的界面元素布局

 */

#ifndef LAYOUT_MANAGER_H

#define LAYOUT_MANAGER_H

#include "display_abstraction.h"

/* 对齐方式枚举 */

typedef enum

{

    ALIGN_LEFT,

    ALIGN_CENTER,

    ALIGN_RIGHT,

    ALIGN_TOP,

    ALIGN_MIDDLE,

    ALIGN_BOTTOM

} alignment_t;

/* 相对位置结构体 */

typedef struct

{

    float x_percent;     /* X坐标百分比 (0.0-1.0) */

    float y_percent;     /* Y坐标百分比 (0.0-1.0) */

    float width_percent; /* 宽度百分比 (0.0-1.0) */

    float height_percent; /* 高度百分比 (0.0-1.0) */

    alignment_t h_align; /* 水平对齐方式 */

    alignment_t v_align; /* 垂直对齐方式 */

} relative_position_t;

/* GUI元素基类 */

typedef struct gui_element

{

    char* id;                      /* 元素ID */

    relative_position_t position;  /* 相对位置 */

    bool visible;                  /* 是否可见 */

   

    /* 绘制函数 */

    void (*draw)(struct gui_element* element);

   

    /* 事件处理函数 */

    bool (*handle_event)(struct gui_element* element, void* event);

   

    /* 布局计算函数 */

    void (*calculate_layout)(struct gui_element* element, rect_t* parent_rect);

   

    /* 实际屏幕位置 */

    rect_t screen_rect;

   

    /* 指向下一个元素的指针 */

    struct gui_element* next;

} gui_element_t;

/* 布局管理器 */

typedef struct

{

    gui_element_t* elements;       /* 元素链表 */

    display_interface_t* display;  /* 显示接口 */

    rect_t root_rect;              /* 根区域 */

} layout_manager_t;

/* 初始化布局管理器 */

void layout_manager_init(layout_manager_t* manager, display_interface_t* display);

/* 添加GUI元素 */

void layout_manager_add_element(layout_manager_t* manager, gui_element_t* element);

/* 移除GUI元素 */

void layout_manager_remove_element(layout_manager_t* manager, gui_element_t*

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

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

相关文章

11. MySQL事务管理(上)

1. CURD不加控制&#xff0c;会有什么问题&#xff1f; 火车票售票系统tickets表 id name nums 10 西安<->兰州 1 客户端A 客户端B if (nums > 0) { if (nums > 0) { 卖票 卖票 // update numsnums - 1 update numsnums - 1 } } 当客户端A检查还有一张票时&#xf…

Beta分布Dirichlet分布

目录 Beta分布Dirichlet分布Beta分布&Dirichlet分布从Dirichlet分布生成Beta样本Beta分布&Dirichlet分布应用 Beta分布 Beta分布是定义在区间 [ 0 , 1 ] [0, 1] [0,1]上的连续概率分布&#xff0c;通常用于模拟概率或比例的随机变量。Beta分布的概率密度函数&#xff…

嵌入式系统中常用的开源协议

目录 1、GNU通用公共许可证&#xff08;GPL&#xff09; 2、GNU宽松通用公共许可证&#xff08;LGPL&#xff09; 3、MIT许可证 4、Apache许可证2.0 5、BSD许可证 6、如何选择合适的协议 在嵌入式系统开发中&#xff0c;开源软件的使用已成为主流趋势。从物联网设备到汽车…

告别延迟,拥抱速度:存储加速仿真应用的解决方案【1】

需求分析 现代仿真&#xff08;如CFD流体动力学、FEA结构分析、电磁仿真、气候模拟、自动驾驶场景仿真、芯片设计等&#xff09;会产生PB级甚至EB级的数据。海量数据的生成、处理和存储&#xff0c;主要体现在以下几个关键方面&#xff1a; 数据量爆炸式增长&#xff1a;高分…

vue封装gsap自定义动画指令

1、指令文件封装 import { gsap } from gsap;// 动画类型配置 const ANIMATION_TYPES {// 缩放scale: {from: { scale: 0.5, opacity: 0 },to: { scale: 1, opacity: 1 },hide: { scale: 0.5, opacity: 0 },},// 透明度fade: {from: { opacity: 0 },to: { opacity: 1, ease: …

HTTP 如何升级成 HTTPS

有一个自己的项目需要上线&#xff0c;域名解析完成后&#xff0c;发现只能使用 http 协议&#xff0c;这在浏览器上会限制&#xff0c;提示用户不安全&#xff0c;所以需要把 HTTP 升级成 HTTPS 协议&#xff0c;但又不想花钱。 前提条件&#xff1a; 已经配置好 Nginx 服务器…

测试面试题总结一

目录 列表、元组、字典的区别 nvicat连接出现问题如何排查 mysql性能调优 python连接mysql数据库方法 参数化 pytest.mark.parametrize 装饰器 list1 [1,7,4,5,5,6] for i in range(len(list1): assert list1[i] < list1[i1] 这段程序有问题嘛&#xff1f; pytest.i…

[蓝桥杯]密文搜索

密文搜索 题目描述 福尔摩斯从 X 星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为 8 的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜…

打卡第36天:模型可视化以及推理

知识点回顾&#xff1a; 1.三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化 2.进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观 3.推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&#xff0c;对…

8天Python从入门到精通【itheima】-68(元组)

目录 65节——元组的定义和操作 1.学习目标 2.为什么要学习元组 3.元组的定义 4.定义元组的注意事项 5.元组的嵌套 6.元组的相关操作 【1】index方法 【2】count方法 【3】len方法 7.元组的遍历 【1】while循环进行元组的遍历 【2】for循环进行元组的变量 Python …

链表题解——环形链表【LeetCode】

141. 环形链表 方法一 核心思想&#xff1a; 使用一个集合 seen 来记录已经访问过的节点。遍历链表&#xff0c;如果当前节点已经存在于集合中&#xff0c;说明链表存在环&#xff1b;否则&#xff0c;将当前节点添加到集合中&#xff0c;继续遍历。如果遍历结束&#xff08;h…

【免费数据】1980-2022年中国2384个站点的水质数据

水&#xff0c;是生命之源&#xff0c;关乎着地球上每一个生物的生存与发展。健康的水生生态系统维持着整个水生态的平衡与活力&#xff1b;更是确保人类能持续获得清洁水源的重要保障。水质数据在水质研究、海洋生物量测算以及生物多样性评估等诸多关键领域都扮演着举足轻重的…

分享推荐高精度磁阻式磁编码器芯片

磁编码器其通过感应旋转磁场来实现角度、转速的测量&#xff0c;因此&#xff0c;相较于传统的光编码器&#xff0c;磁编码器对粉尘、污垢和油脂等污染物有很强的耐受性&#xff0c;即使在较为恶劣的环境中仍能够保持高分辨率与检测精度&#xff0c;安装和维护简捷方便&#xf…

Spring AI 项目实战(四):Spring Boot + AI + DeepSeek 超参数优化——智能化机器学习平台(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战&#xff08;一&#xff09;&#xff1a;Spring AI 核心模块入门2Spring AI 项目实战&#xff08;二&#xff09;&#xff1a;Spring Boot AI DeepSeek 深度实战&#xff08;附完整源码&#xff09;3Spring AI 项目实战&#xff08…

高效VLM:VisionZip

论文&#xff1a;[2412.04467] VisionZip: Longer is Better but Not Necessary in Vision Language Models github&#xff1a;https://github.com/dvlab-research/VisionZip LLaVA论文&#xff1a;https://arxiv.org/abs/2310.03744 LLaVA仓库&#xff1a;https://github.…

华为设备OSPF配置与实战指南

一、基础配置架构 sysname HUAWEI-ABR ospf 100 router-id 1.1.1.1area 0.0.0.0network 10.1.1.0 0.0.0.255 # 将接口加入区域0 interface GigabitEthernet0/0/1ospf enable 100 area 0.0.0.0 # 华为支持点分十进制区域号bandwidth-reference 10000 # 设置10Gbps参考带宽…

区块链架构深度解析:从 Genesis Block 到 Layer 2

# 区块链架构深度解析&#xff1a;从 Genesis Block 到 Layer 2 目录 一、Genesis Block&#xff1a;区块链的起点 二、Layer 0&#xff1a;区块链的底层网络架构 三、Layer 1&#xff1a;核心协议层 &#x1f680; 四、Layer 2&#xff1a;扩展性解决方案 五、未来展望&a…

【位运算】丢失的数字(easy)

34. 丢失的数字&#xff08;easy&#xff09; 题⽬描述&#xff1a;方法一&#xff1a;排序解法&#xff08;位运算&#xff09;&#xff1a;C 算法代码&#xff1a;Java 算法代码&#xff1a; 题⽬链接&#xff1a; 268. 丢失的数字 题⽬描述&#xff1a; 给定⼀个包含 [0, n…

如何通过RL真正提升大模型的推理能力?NVIDIA提出长期强化学习训练框架ProRL

原文&#xff1a;https://mp.weixin.qq.com/s/QLFKvb8Ol3CX9uWKBXSrow 论文&#xff1a;ProRL: Prolonged Reinforcement Learning Expands Reasoning Boundaries in Large Language Models Abs&#xff1a;https://arxiv.org/abs/2505.24864 权重下载&#xff1a;https://hugg…

ORM 框架的优缺点分析

ORM 框架的优缺点分析 一、ORM 框架概述 ORM(Object-Relational Mapping)是一种将关系型数据库与面向对象编程进行映射的技术框架。它通过将数据库表映射为编程语言中的类,将记录映射为对象,将字段映射为属性,实现了用面向对象的方式操作数据库。 核心价值:ORM 在数据库和…