C语言用LVGL完成分层菜单的详细代码与注释
时间: 2024-09-25 13:18:58 浏览: 40
LVGL是一个轻量级的GUI库,用于嵌入式系统,特别适合资源受限的设备。要在C语言中使用LVGL创建分层菜单,你需要先安装LVGL库并包含相关的头文件。以下是简单的示例代码及注释:
```c
#include "lvgl.h" // 引入LVGL核心库
// 创建顶层窗口
static lv_obj_t *root_menu; // 顶级菜单指针
void create_root_menu(void) {
static const char *menu_titles[] = {"一级菜单", "二级菜单", "三级菜单"};
// 初始化LVGL
if (lv_init() != LV_OK) {
printf("LVGL初始化失败\n");
return;
}
// 创建一个布局(这里用的是瀑布流布局)
lv_obj_t *layout = lv_layout_create();
if (!layout) {
printf("布局创建失败\n");
return;
}
// 设置布局属性
lv_layout_set_flow(layout, LV_LAYOUT_FLOW_HORIZONTAL);
lv_obj_set_parent(layout, NULL); // 将布局设为根窗口的直接子项
// 为每个层级添加菜单项
for (int i = 0; i < sizeof(menu_titles) / sizeof(char*); i++) {
// 创建菜单
lv_obj_t *menu = lv_menubtn_create(layout, NULL); // 使用menubtn作为分层菜单
lv_obj_set_size(menu, LV_HOR_RES, LV_MAX(80, lv_font_get_line_height(lv_theme_get_font(lv_scr_get_style(), LV_LABEL_FONT_SUB1))); // 宽度自适应高度设置
// 设置标题文本
lv_label_set_text((lv_label_t *)menu, menu_titles[i]);
// 添加到当前菜单
if (i == 0) {
root_menu = menu; // 保存顶级菜单
} else {
lv_obj_set_parent(menu, root_menu); // 根据层级关联上级菜单
}
// 当用户点击菜单时,处理事件
lv_event_cb_t event_handler = LV_EVENT_CLICKED, &handle_click;
handle_click.user_data = menu;
lv_obj_set_event_cb(menu, event_handler, &handle_click);
}
}
// 点击事件处理函数
static void handle_click(lv_obj_t *obj, void *user_data) {
lv_obj_t *parent_menu = (lv_obj_t *)user_data; // 获取当前点击的菜单
lv_menubtn_toggle(parent_menu); // 展开或折叠子菜单
}
// 主函数
int main(void) {
create_root_menu(); // 初始化并创建顶级菜单
lv_task_handler(); // 进行主循环
return 0;
}
```
阅读全文