发布时间:2026/8/22 11:30:32
LVGL 开发笔记 LVGL采用的是一种面对对象编程思维在 C语言中并没有“类”的概念而LVGL通过结构体的形式实现了“类”的功能并 非真的“类”具体的实现逻辑如下图所示lv_obj_t 定义控件界面、按钮、文本变量 必须是指针类型LVGL 的所有样式设置、坐标对齐、事件绑定函数参数类型统一都是lv_obj_t *同时lv_obj_t 结构体的大小并不是完全固定死的它会根据你在 lv_conf.h 里的配置比如是否开启扩展属性、是否开启用户数据 LV_USE_USER_DATA、开启了哪些模块而在编译期改变结构体的大小因此在 LVGL 中定义控件变量时必须且只能是指针类型lv_obj_t *lv_obj_create() 创建容器、界面常用它创建界面、自定义控件的基础创建新界面首先要获取屏幕正在显示的活动屏幕对象lv_scr_act() 是 lv_screen_active()或 lv_scr_act 宏的缩写它是整个 UI 树的根节点Root Node。在 LVGL 中所有控件都遵循父子树形结构Parent-Child Tree。创建任何控件或容器比如 lv_obj_create时必须指定一个“父对象”parentlv_obj_t *scr lv_scr_act();lv_obj_t *page lv_obj_create(scr);lv_obj_create这些创建函数返回一个lv_obj_t类型的指针指向你创建的控件lv_obj_t结构体lv_obj_t结构体typedef struct _lv_obj_t {const lv_obj_class_t * class_p;struct _lv_obj_t * parent;_lv_obj_spec_attr_t * spec_attr;_lv_obj_style_t * styles;#if LV_USE_USER_DATAvoid * user_data;#endiflv_area_t coords;lv_obj_flag_t flags;lv_state_t state;uint16_t layout_inv : 1;uint16_t scr_layout_inv : 1;uint16_t skip_trans : 1;uint16_t style_cnt : 6;uint16_t h_layout : 1;uint16_t w_layout : 1;} lv_obj_t;里面包含控件类型父对象样式列表先获取当前正在显示的屏幕对象作为父节点 page为子对象作为创建的界面然后定义大小、样式同样界面里面的按钮文本这些控件也是page的子对象lv_btn_create() 创建按钮lv_label_create() 创建文本lv_obj_set_size(btn_back, 70, 46); //控件大小lv_obj_align(btn_back, LV_ALIGN_BOTTOM_RIGHT, -82, -44); //控件对齐方式也就是控件位置 param控件对象相对于父容器对齐方式x轴y轴左负右正lv_obj_add_event_cb( //按钮绑定事件回调函数也就是点击按钮会触发什么事件、触摸动作btn_back,page_navigate_cb, //事件回调函数LV_EVENT_CLICKED, //触摸事件(void *)(intptr_t)PAGE_HOME); //传给回调函数的变量用户自定义数据lv_timer_create()LVGL的软定时器lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); 可以周期行的执行回调函数eg lv_timer_create(machine_running_ui_timer_cb, 100, NULL); 100ms 执行一次machine_running_ui_timer_cb函数字体eg:lv_obj_t *lbl_prefix lv_label_create(loop_cont); //文本标签lv_label_set_text(lbl_prefix, 剩余圈数); //显示文本内容lv_obj_set_style_text_color(lbl_prefix, lv_color_hex(0x354554), 0); //字体颜色 第三个参数selector 选择器常用0 也可以根据按钮状态动态的显示颜色lv_obj_set_style_text_font(lbl_prefix, lv_my_Font_20, 0); //使用的是哪一个字体LVGL没有中文字库显示的汉字需要到LVGL官方转换器里面把汉字转换成C语言文件得到这个C语言文件之后添加到LVGL源码font目录下并添加到项目工程然后在头文件或者.c文件顶部添加中文字体宏定义 LV_FONT_DECLARE(lv_my_Font_20);

相关新闻

2026/8/22 11:30:32

053、ABAP数据字典与ABAP程序联动

053、ABAP数据字典与ABAP程序联动 昨晚线上一个报表突然查不出数据,用户那边直接炸了。我远程连上去一看,程序逻辑没动过,数据库表里也有记录,但SELECT就是查不到。后来发现是有人在前台顺手改了一个数据元素,把域里的…

2026/8/22 11:30:32

052、帮助视图与锁视图

调试一个报表取数异常,愣是耗了整个下午。查到最后,根源出在视图上——不是数据库表,而是那种带关联条件的帮助视图。SE11里看着数据好好的,一进程序就缺行,或者重复。那时候你才会意识到,对ABAP视图的理解…

2026/8/22 12:55:37

魔方复原方法推导

目录 一,复原问题完整模型 1,部件信息 2,复原状态 3,部件朝向 4,幽灵部件 5,可执行操作 6,部件目标位置二分图 7,唯一部件、可交换部件 8,关于构建部件目标位置…

2026/8/22 12:55:37

如何修复截断的 MP4 视频:Untrunc 完整使用指南

如何修复截断的 MP4 视频:Untrunc 完整使用指南 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc Untrunc 是一款免费的命令行 MP4 修复工具,通…

2026/8/22 12:55:37

104.无源门禁卡一贴就用?RC522射频识别原理与完整代码实现

一、为什么门禁卡没有电池也能工作?日常使用的门禁卡大多是无源RFID卡,本质上是一种被动式射频识别标签,本身没有内置电池。当你把它靠近门禁读卡器时,背后其实发生了一套精密的能量耦合与数据交互过程。1.1 核心原理:…

2026/8/21 13:13:49

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 20:14:07

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/21 15:40:01

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/22 1:39:53

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…