Multiple windows

Description

How is the transition between windows? For example, there are window 1 window 2 window 3. There are 3 buttons on the main screen. When I press button 1, window 1 will open, when I press the close button, it will close. Other buttons will continue like this.
I did this simply, but how can I stop or delete the previous screen (home screen) when switching from the home screen to the window?
My LCD is 800x480

What MCU/Processor/Board and compiler are you using?

STM32f429ZI

What LVGL version are you using?

V6

What do you want to achieve?

How is the transition between windows?

What have you tried so far?

I tried the lv_obj_del () command but the program usually crashed

Code to reproduce

static void btn1_event_cb(lv_obj_t * btn, lv_event_t event)
{
if(event == LV_EVENT_RELEASED) {
lv_obj_t * win = lv_win_create(lv_scr_act(), NULL);
lv_win_set_title(win, “Button 1 Win”);
lv_obj_set_size(win, 400, 400);
lv_obj_t * close_btn = lv_win_add_btn(win, LV_SYMBOL_CLOSE);
lv_obj_set_event_cb(close_btn, lv_win_close_event_cb);
lv_win_add_btn(win, LV_SYMBOL_SETTINGS);

	lv_obj_align(win, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_t * txt = lv_label_create(win, NULL);
lv_label_set_text(txt, "Exam1");
}

}
static void btn2_event_cb(lv_obj_t * btn, lv_event_t event)
{
if(event == LV_EVENT_RELEASED) {
lv_obj_t * win = lv_win_create(lv_scr_act(), NULL);
lv_win_set_title(win, “Button 2 Win”);
lv_obj_set_size(win, 400, 400);
lv_obj_t * close_btn = lv_win_add_btn(win, LV_SYMBOL_CLOSE);
lv_obj_set_event_cb(close_btn, lv_win_close_event_cb);
lv_win_add_btn(win, LV_SYMBOL_SETTINGS);

	lv_obj_align(win, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_t * txt = lv_label_create(win, NULL);
lv_label_set_text(txt, "Exam2");
}

}
static void btn3_event_cb(lv_obj_t * btn, lv_event_t event)
{
if(event == LV_EVENT_RELEASED) {
lv_obj_t * win = lv_win_create(lv_scr_act(), NULL);
lv_win_set_title(win, “Button 3 Win”);
lv_obj_set_size(win, 400, 400);
lv_obj_t * close_btn = lv_win_add_btn(win, LV_SYMBOL_CLOSE);
lv_obj_set_event_cb(close_btn, lv_win_close_event_cb);
lv_win_add_btn(win, LV_SYMBOL_SETTINGS);

	lv_obj_align(win, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_t * txt = lv_label_create(win, NULL);
lv_label_set_text(txt, "Exam3");
}

}
void exam(void)
{
lv_obj_t *tabview;
tabview = lv_tabview_create(lv_scr_act(), NULL);

lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); 
lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL); 
lv_obj_t * btn3 = lv_btn_create(lv_scr_act(), NULL); 

lv_obj_set_pos(btn1, 10, 350); 
lv_obj_set_pos(btn2, 190, 350); 
lv_obj_set_pos(btn3, 370, 350); 

lv_obj_set_size(btn1, 150, 100); 
lv_obj_set_size(btn2, 150, 100);
lv_obj_set_size(btn3, 150, 100);

lv_obj_t * labelButon1 = lv_label_create(btn1, NULL); 
lv_obj_t * labelButon2 = lv_label_create(btn2, NULL); 
lv_obj_t * labelButon3 = lv_label_create(btn3, NULL); 

lv_label_set_text(labelButon1, "BUTTON 1");
lv_label_set_text(labelButon2, "BUTTON 2");
lv_label_set_text(labelButon3, "BUTTON 3");

lv_obj_set_event_cb(btn1, btn1_event_cb); 
lv_obj_set_event_cb(btn2, btn2_event_cb); 
lv_obj_set_event_cb(btn3, btn3_event_cb); 

}

Screenshot and/or video

I suggest using screens as functions instead of opening windows. Them:

/* In main: */
/* ... */
lv_obj_t* screen_2 = lv_obj_create(NULL, NULL);
create_screen2(screen2);
/* ... */

static void event_button_change_to_screen_2(lv_obj_t* btn, lv_event_t event)
 {
     if (event == LV_EVENT_CLICKED){
         lv_scr_load(screen_2);
     }
 }

This solution will likely require you to load all screens at start, and is better suited for a program with a well defined fluxogram.

Another solution is to use:

lv_obj_set_hidden(object, true);

To hide and show widgets as the user navigates in your application.

I use this link and work.
lv_obj_t * first = lv_obj_create(NULL, NULL);
lv_scr_load(first);
/* Later /
lv_obj_t * prev = lv_scr_act(); /
save previously active screen /
lv_obj_t * second = lv_obj_create(NULL, NULL);
lv_scr_load(second);
lv_obj_del(prev); /
prev is now not the active screen, so it can safely be deleted */