今天使用msgbox也就是消息框控件出现了问题
创建了一个按键,在按键的回调函数里面创建新的label或msgbox,为什么显示不出来?
static void record_event_cb(lv_event_t* e)
{
lv_obj_t* real_value_text = lv_label_create(container_1);
lv_label_set_text(real_value_text, line1);
lv_obj_align(real_value_text, LV_ALIGN_TOP_LEFT, 0, 10 * LINE_SPACING);
}
container_1是当前显示的页面,也就是容纳这个按钮的容器。
首先,我在建立这个container_1页面的函数中,增加了一个本应该很有用的函数:lv_scr_load
void page_1_1(void)
{
container_1 = lv_obj_create(lv_scr_act());
………
lv_scr_load(container_1);
}
如果注释掉这个lv_scr_load函数,那么上述的回调函数中的创建text就可以正常进行。
那我们来看看这个lv_scr_load函数到底做了些什么:
首先lv_scr_load直接调用lv_disp_load_scr(scr);
然后lv_disp_load_scr调用lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false);
也就是没有动画的lv_scr_load_anim
lv_scr_load_anim:传参 new_scr
获得当前显示器对象lv_obj_get_disp
获得当前屏幕lv_scr_act
如果当前有其他屏幕需要被加载, 放弃那个屏幕的动画,让他赶紧加载完
显示器的下一个加载对象(scr_to_load) = new_scr;
如果显示器有上一个屏幕(prev_scr)&&要求删除上一个屏幕(del_prev)//这一句不会执行
删除上一个屏幕
删除new_scr的动画效果
删除lv_scr_act的动画效果
lv_obj_set_pos(new_scr, 0, 0);
lv_obj_set_pos(lv_scr_act(), 0, 0);
scr_load_internal(new_scr);
后面就是一些关于动画的代码了
看来核心就是这个scr_load_internal(new_scr);
获得当前显示器对象lv_obj_get_disp
获得当前屏幕lv_scr_act
向当前屏幕发送事件LV_EVENT_SCREEN_UNLOAD_START
向new_scr发送事件LV_EVENT_SCREEN_LOAD_START
d->act_scr = scr;
向new_scr发送事件LV_EVENT_SCREEN_LOADED
向老屏幕发送事件LV_EVENT_SCREEN_UNLOADED
lv_obj_invalidate(scr); 将scr的区域标记为invalid,刷新scr的显示
好像得不出什么有用的结论
算了,直接把msgbox画在最顶层吧。