两行LVGL事件API详细解析

1.lv_obj_t *target = lv_event_get_target(e);

作用:获取真正触发事件的底层子对象(触发源)

含义

弹窗msgbox内部包含标题文本、关闭叉号、多个按钮等子控件:

  • 点击Continue按钮 →target= 这个按钮对象

  • 点击Close按钮 →target= Close按钮对象

  • 点击右上角蓝色关闭叉号 →target= 叉号图标对象

  • 点击弹窗空白区域 →target= 弹窗本体内部面板

使用场景

想区分用户到底点了弹窗里哪一个子控件时用它。

2.lv_event_code_t code = lv_event_get_code(e);

作用:获取本次触发的事件类型(枚举值)

常见事件类型(msgbox场景)

事件码含义
LV_EVENT_CLICKED鼠标/触摸单击对象
LV_EVENT_VALUE_CHANGED控件状态变更(msgbox按下按钮专属事件)
LV_EVENT_PRESSING持续按住对象(会高频循环触发,你之前疯狂打印5就是这个)
LV_EVENT_RELEASED松开点击

使用场景

同一个回调绑定多种事件时,通过code判断当前是什么操作,分支处理逻辑。


结合你弹窗的场景区分

假设绑定事件给msgbox弹窗本体:

  1. 点Continue按钮
    • lv_event_get_target(e)→ Continue按钮对象

    • lv_event_get_code(e)LV_EVENT_VALUE_CHANGED(按钮切换选中)

  2. 点右上角关闭叉号
    • lv_event_get_target(e)→ 关闭图标对象

    • lv_event_get_code(e)LV_EVENT_CLICKED

  3. 鼠标长按弹窗空白处不动
    • lv_event_get_target(e)→ 弹窗面板

    • lv_event_get_code(e)LV_EVENT_PRESSING(持续刷新,疯狂进回调打印5)

补充你之前打印65535的核心原因

当事件码是LV_EVENT_CLICKED / LV_EVENT_PRESSING这类非按钮切换事件时,lv_msgbox_get_active_btn(msgbox)无选中按钮,返回0xFFFF=65535; 只有事件码 =LV_EVENT_VALUE_CHANGED时,函数才能正确读取按钮下标0/1。