两行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弹窗本体:
- 点Continue按钮
lv_event_get_target(e)→ Continue按钮对象lv_event_get_code(e)→LV_EVENT_VALUE_CHANGED(按钮切换选中)
- 点右上角关闭叉号
lv_event_get_target(e)→ 关闭图标对象lv_event_get_code(e)→LV_EVENT_CLICKED
- 鼠标长按弹窗空白处不动
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。
