找回密码
 立即注册
首页 业界区 科技 LVGL-菜单

LVGL-菜单

士沌 2025-6-30 18:09:05
lv_menu_create

用于创建菜单对象
  1. lv_obj_t * lv_menu_create(lv_obj_t * parent);
  2. //parent:指向父对象的指针
  3. //ret:返回创建菜单的句柄,如果失败(例如内存不足),返回 NULL
复制代码
lv_menu_page_create

用于创建菜单页面的函数
  1. lv_obj_t * lv_menu_page_create(lv_obj_t * parent, const char * title);
  2. //parent:指向父对象的指针
  3. //title:页面的标题,可以为菜单页面设置一个标题,也可以传入 NULL 来创建一个没有标题的页面
  4. //ret:指向新创建的菜单页面对象的指针。如果创建成功,返回菜单页面对象的指针;如果失败(例如内存不足),返回 NULL
复制代码
lv_menu_cont_create

用于在 LVGL 的菜单页面中创建一个容器(container),作为子控件的布局载体。该容器通常用于组织菜单项(如标签、按钮等),并支持事件绑定以实现页面跳转等功能
  1. lv_obj_t* lv_menu_cont_create(lv_obj_t* parent_page);
  2. //parent_page:父级菜单页面对象
  3. //ret:返回创建的容器对象
复制代码
lv_menu_section_create

用于在菜单页面中创建分区(section)的函数,主要用于组织菜单项的逻辑分组
  1. lv_obj_t* lv_menu_section_create(lv_obj_t* parent_page);
  2. //parent_page:父级菜单页面对象
  3. //ret:返回分区对象
复制代码
lv_menu_separator_create

用于在菜单页面中创建分隔线的函数
  1. lv_obj_t* lv_menu_separator_create(lv_obj_t* parent_page);
  2. //parent_page:父级菜单页面对象
  3. //ret:返回分隔线对象
复制代码
lv_menu_set_page/lv_menu_set_sidebar_page

用于设置菜单当前显示页面的核心函数,支持主容器和侧边栏容器的页面切换
  1. void lv_menu_set_page(lv_obj_t* menu, lv_obj_t* page);  // 设置主容器页面
  2. void lv_menu_set_sidebar_page(lv_obj_t* menu, lv_obj_t* page);  // 设置侧边栏页面
  3. //menu:菜单对象(通过 lv_menu_create() 创建)
  4. //page:目标页面对象(通过 lv_menu_page_create() 创建),传入 NULL 可清空当前页面
复制代码
lv_menu_set_mode_header

用于设置菜单标题栏(header)显示模式的函数,通过调整标题栏的位置和滚动行为,可以灵活定制菜单的界面布局
  1. void lv_menu_set_mode_header(lv_obj_t* menu, lv_menu_mode_header_t mode);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. /*
  4. mode:标题栏模式
  5. LV_MENU_HEADER_TOP_FIXED:标题栏固定在顶部,不随页面滚动 。
  6. LV_MENU_HEADER_TOP_UNFIXED:标题栏初始位于顶部,但可随页面滚动移出视图 。
  7. LV_MENU_HEADER_BOTTOM_FIXED:标题栏固定在底部
  8. */
复制代码
lv_menu_set_mode_root_back_btn

用于设置菜单根页面返回按钮模式的函数,通过控制返回按钮的显示与交互逻辑,实现多级菜单的导航管理
  1. void lv_menu_set_mode_root_back_btn(lv_obj_t* menu, lv_menu_mode_root_back_btn_t mode);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //mode:模式枚举值:
  4. //LV_MENU_ROOT_BACK_BTN_DISABLED:禁用返回按钮。
  5. //LV_MENU_ROOT_BACK_BTN_ENABLED:启用返回按钮
复制代码
lv_menu_set_load_page_event

用于绑定菜单项与页面跳转事件的关键函数,通过将控件(如按钮)与目标页面关联,实现点击后自动切换菜单页面的交互逻辑
  1. void lv_menu_set_load_page_event(
  2.     lv_obj_t* menu,      // 菜单对象(通过lv_menu_create创建)
  3.     lv_obj_t* obj,       // 触发事件的控件(如按钮、容器)
  4.     lv_obj_t* page       // 目标页面(通过lv_menu_page_create创建)
  5. );
复制代码
lv_menu_get_cur_main_page

用于获取菜单当前显示的主页面对象的函数
  1. lv_obj_t* lv_menu_get_cur_main_page(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:当前主页面对象指针,若菜单未设置页面则返回 NULL
复制代码
lv_menu_get_cur_sidebar_page

用于获取菜单当前显示的侧边栏页面对象的函数
  1. lv_obj_t* lv_menu_get_cur_sidebar_page(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:当前侧边栏页面对象指针,若未设置侧边栏则返回 NULL
复制代码
lv_menu_get_main_header

用于获取菜单对象的主标题栏(header)对象的函数
  1. lv_obj_t* lv_menu_get_main_header(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:主标题栏对象指针,若菜单未初始化或标题栏被隐藏则返回 NULL
复制代码
lv_menu_get_main_header_back_btn

用于获取菜单主标题栏(header)中返回按钮对象的函数
  1. lv_obj_t* lv_menu_get_main_header_back_btn(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:返回按钮对象指针,若未启用返回按钮或标题栏未初始化则返回 NULL
复制代码
lv_menu_get_sidebar_header

用于获取菜单侧边栏标题栏(header)对象的函数
  1. lv_obj_t* lv_menu_get_sidebar_header(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:侧边栏标题栏对象指针,若未设置侧边栏或标题栏被隐藏则返回 NULL
复制代码
lv_menu_get_sidebar_header_back_btn

用于获取菜单侧边栏标题栏(sidebar header)中的返回按钮对象的函数
  1. lv_obj_t* lv_menu_get_sidebar_header_back_btn(lv_obj_t* menu);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //ret:侧边栏返回按钮对象指针,若侧边栏未启用或标题栏未包含返回按钮则返回 NULL
复制代码
lv_menu_back_btn_is_root

用于判断菜单返回按钮是否为根页面返回按钮的函数
  1. bool lv_menu_back_btn_is_root(lv_obj_t* menu, lv_obj_t* btn);
  2. //menu:菜单对象(通过 lv_menu_create() 创建)
  3. //btn:待检查的按钮对象
  4. //ret:按钮是根页面返回按钮则返回 true,否则返回 false
复制代码
lv_menu_clear_history

用于清除菜单导航历史的函数
  1. void lv_menu_clear_history(lv_obj_t* menu);
  2. //menu:菜单对象(需通过 lv_menu_create() 创建)
复制代码
  1. void lv_example_menu_1(void) // 定义一个函数,用于创建菜单示例
  2. {
  3.     // 创建一个菜单对象,并将其添加到当前屏幕
  4.     lv_obj_t * menu = lv_menu_create(lv_scr_act());
  5.     // 将菜单对象的大小设置为整个屏幕的分辨率
  6.     lv_obj_set_size(menu, lv_disp_get_hor_res(NULL), lv_disp_get_ver_res(NULL));
  7.     // 将菜单对象居中(虽然菜单已经填满屏幕,这一步在这里没有实际效果,但通常用于其他对象时会很有用)
  8.     lv_obj_center(menu);
  9.     // 定义两个指针变量,用于后续创建容器和标签
  10.     lv_obj_t * cont;
  11.     lv_obj_t * label;
  12.     // 创建一个子页面,用于存放隐藏的内容
  13.     lv_obj_t * sub_page = lv_menu_page_create(menu, NULL);
  14.     // 在子页面中创建一个容器
  15.     cont = lv_menu_cont_create(sub_page);
  16.     // 在容器中创建一个标签
  17.     label = lv_label_create(cont);
  18.     // 设置标签的文本内容
  19.     lv_label_set_text(label, "Hello, I am hiding here");
  20.     // 创建一个主页面,用于显示主菜单项
  21.     lv_obj_t * main_page = lv_menu_page_create(menu, NULL);
  22.     // 在主页面中创建一个容器
  23.     cont = lv_menu_cont_create(main_page);
  24.     // 在容器中创建一个标签
  25.     label = lv_label_create(cont);
  26.     // 设置标签的文本内容
  27.     lv_label_set_text(label, "Item 1");
  28.     // 在主页面中创建另一个容器
  29.     cont = lv_menu_cont_create(main_page);
  30.     // 在容器中创建一个标签
  31.     label = lv_label_create(cont);
  32.     // 设置标签的文本内容
  33.     lv_label_set_text(label, "Item 2");
  34.     // 在主页面中创建第三个容器
  35.     cont = lv_menu_cont_create(main_page);
  36.     // 在容器中创建一个标签
  37.     label = lv_label_create(cont);
  38.     // 设置标签的文本内容
  39.     lv_label_set_text(label, "Item 3 (Click me!)");
  40.     // 设置点击该容器时加载的页面为子页面
  41.     lv_menu_set_load_page_event(menu, cont, sub_page);
  42.     // 将主页面设置为菜单的当前页面
  43.     lv_menu_set_page(menu, main_page);
  44. }
复制代码
  1. // 定义一个枚举类型,用于指定菜单项的构建变体
  2. enum {
  3.     LV_MENU_ITEM_BUILDER_VARIANT_1, // 第一种变体
  4.     LV_MENU_ITEM_BUILDER_VARIANT_2  // 第二种变体
  5. };
  6. // 使用 uint8_t 类型定义一个新类型,用于表示菜单项构建变体
  7. typedef uint8_t lv_menu_builder_variant_t;
  8. // 声明事件处理函数,用于处理返回按钮的点击事件
  9. static void back_event_handler(lv_event_t * e);
  10. // 声明事件处理函数,用于处理开关的状态变化事件
  11. static void switch_handler(lv_event_t * e);
  12. // 定义一个全局变量,用于存储根页面的指针
  13. lv_obj_t * root_page;
  14. // 声明辅助函数,用于创建带有文本的菜单项
  15. static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char * txt,
  16.                               lv_menu_builder_variant_t builder_variant);
  17. // 声明辅助函数,用于创建带有滑块的菜单项
  18. static lv_obj_t * create_slider(lv_obj_t * parent,
  19.                                 const char * icon, const char * txt, int32_t min, int32_t max, int32_t val);
  20. // 声明辅助函数,用于创建带有开关的菜单项
  21. static lv_obj_t * create_switch(lv_obj_t * parent,
  22.                                 const char * icon, const char * txt, bool chk);
  23. // 主函数,用于创建菜单示例
  24. void lv_example_menu_5(void)
  25. {
  26.     // 创建一个菜单对象,并将其添加到当前屏幕
  27.     lv_obj_t * menu = lv_menu_create(lv_scr_act());
  28.     // 获取菜单对象的背景颜色
  29.     lv_color_t bg_color = lv_obj_get_style_bg_color(menu, 0);
  30.     // 根据背景颜色的亮度调整背景颜色
  31.     if(lv_color_brightness(bg_color) > 127) {
  32.         lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 10), 0);
  33.     }
  34.     else {
  35.         lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 50), 0);
  36.     }
  37.     // 启用根页面的返回按钮
  38.     lv_menu_set_mode_root_back_btn(menu, LV_MENU_ROOT_BACK_BTN_ENABLED);
  39.     // 为菜单对象添加点击事件回调函数
  40.     lv_obj_add_event_cb(menu, back_event_handler, LV_EVENT_CLICKED, menu);
  41.     // 设置菜单对象的大小为整个屏幕
  42.     lv_obj_set_size(menu, lv_disp_get_hor_res(NULL), lv_disp_get_ver_res(NULL));
  43.     // 将菜单对象居中(虽然菜单已经填满屏幕,这一步在这里没有实际效果)
  44.     lv_obj_center(menu);
  45.     // 定义两个指针变量,用于后续创建容器和部分
  46.     lv_obj_t * cont;
  47.     lv_obj_t * section;
  48.     /* 创建子页面 */
  49.     // 创建一个子页面,用于存放机械设置
  50.     lv_obj_t * sub_mechanics_page = lv_menu_page_create(menu, NULL);
  51.     // 设置子页面的水平填充
  52.     lv_obj_set_style_pad_hor(sub_mechanics_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  53.     // 创建一个分隔符
  54.     lv_menu_separator_create(sub_mechanics_page);
  55.     // 创建一个部分
  56.     section = lv_menu_section_create(sub_mechanics_page);
  57.     // 在部分中创建滑块,用于设置速度、加速度和重量限制
  58.     create_slider(section, LV_SYMBOL_SETTINGS, "Velocity", 0, 150, 120);
  59.     create_slider(section, LV_SYMBOL_SETTINGS, "Acceleration", 0, 150, 50);
  60.     create_slider(section, LV_SYMBOL_SETTINGS, "Weight limit", 0, 150, 80);
  61.     // 创建一个子页面,用于存放声音设置
  62.     lv_obj_t * sub_sound_page = lv_menu_page_create(menu, NULL);
  63.     // 设置子页面的水平填充
  64.     lv_obj_set_style_pad_hor(sub_sound_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  65.     // 创建一个分隔符
  66.     lv_menu_separator_create(sub_sound_page);
  67.     // 创建一个部分
  68.     section = lv_menu_section_create(sub_sound_page);
  69.     // 在部分中创建开关,用于控制声音
  70.     create_switch(section, LV_SYMBOL_AUDIO, "Sound", false);
  71.     // 创建一个子页面,用于存放显示设置
  72.     lv_obj_t * sub_display_page = lv_menu_page_create(menu, NULL);
  73.     // 设置子页面的水平填充
  74.     lv_obj_set_style_pad_hor(sub_display_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  75.     // 创建一个分隔符
  76.     lv_menu_separator_create(sub_display_page);
  77.     // 创建一个部分
  78.     section = lv_menu_section_create(sub_display_page);
  79.     // 在部分中创建滑块,用于设置亮度
  80.     create_slider(section, LV_SYMBOL_SETTINGS, "Brightness", 0, 150, 100);
  81.     // 创建一个子页面,用于存放软件信息
  82.     lv_obj_t * sub_software_info_page = lv_menu_page_create(menu, NULL);
  83.     // 设置子页面的水平填充
  84.     lv_obj_set_style_pad_hor(sub_software_info_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  85.     // 创建一个部分
  86.     section = lv_menu_section_create(sub_software_info_page);
  87.     // 在部分中创建文本,显示软件版本信息
  88.     create_text(section, NULL, "Version 1.0", LV_MENU_ITEM_BUILDER_VARIANT_1);
  89.     // 创建一个子页面,用于存放法律信息
  90.     lv_obj_t * sub_legal_info_page = lv_menu_page_create(menu, NULL);
  91.     // 设置子页面的水平填充
  92.     lv_obj_set_style_pad_hor(sub_legal_info_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  93.     // 创建一个部分
  94.     section = lv_menu_section_create(sub_legal_info_page);
  95.     // 在部分中创建多个文本项,用于显示长文本内容
  96.     for(uint32_t i = 0; i < 15; i++) {
  97.         create_text(section, NULL,
  98.                     "This is a long long long long long long long long long text, if it is long enough it may scroll.",
  99.                     LV_MENU_ITEM_BUILDER_VARIANT_1);
  100.     }
  101.     // 创建一个子页面,用于存放关于信息
  102.     lv_obj_t * sub_about_page = lv_menu_page_create(menu, NULL);
  103.     // 设置子页面的水平填充
  104.     lv_obj_set_style_pad_hor(sub_about_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  105.     // 创建一个分隔符
  106.     lv_menu_separator_create(sub_about_page);
  107.     // 创建一个部分
  108.     section = lv_menu_section_create(sub_about_page);
  109.     // 在部分中创建文本,用于显示软件和法律信息的入口
  110.     cont = create_text(section, NULL, "Software information", LV_MENU_ITEM_BUILDER_VARIANT_1);
  111.     // 设置点击事件,点击时加载软件信息页面
  112.     lv_menu_set_load_page_event(menu, cont, sub_software_info_page);
  113.     cont = create_text(section, NULL, "Legal information", LV_MENU_ITEM_BUILDER_VARIANT_1);
  114.     // 设置点击事件,点击时加载法律信息页面
  115.     lv_menu_set_load_page_event(menu, cont, sub_legal_info_page);
  116.     // 创建一个子页面,用于存放菜单模式设置
  117.     lv_obj_t * sub_menu_mode_page = lv_menu_page_create(menu, NULL);
  118.     // 设置子页面的水平填充
  119.     lv_obj_set_style_pad_hor(sub_menu_mode_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  120.     // 创建一个分隔符
  121.     lv_menu_separator_create(sub_menu_mode_page);
  122.     // 创建一个部分
  123.     section = lv_menu_section_create(sub_menu_mode_page);
  124.     // 在部分中创建开关,用于控制侧边栏的启用状态
  125.     cont = create_switch(section, LV_SYMBOL_AUDIO, "Sidebar enable", true);
  126.     // 为开关添加事件回调函数,处理开关状态变化
  127.     lv_obj_add_event_cb(lv_obj_get_child(cont, 2), switch_handler, LV_EVENT_VALUE_CHANGED, menu);
  128.     /* 创建根页面 */
  129.     // 创建根页面,标题为 "Settings"
  130.     root_page = lv_menu_page_create(menu, "Settings");
  131.     // 设置根页面的水平填充
  132.     lv_obj_set_style_pad_hor(root_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
  133.     // 创建一个部分
  134.     section = lv_menu_section_create(root_page);
  135.     // 在部分中创建文本,用于显示机械设置的入口
  136.     cont = create_text(section, LV_SYMBOL_SETTINGS, "Mechanics", LV_MENU_ITEM_BUILDER_VARIANT
复制代码
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册