SGL基础知识¶
page概念¶
SGL中的page表示一个绘制页面,其大小为屏幕的宽和高,无法改变,所有的控件都绘制在page中,也就是page是所有的控件的根控件。在调用sgl_init()时就默认创建一个page,作为一个活动的page。 用户也可以自己创建一个page,用来做多页面切换显示。
页面创建(根控件创建)¶
使用sgl_obj_create(NULL)函数创建一个pag,函数原型如下:
sgl_obj_t* sgl_obj_create(sgl_obj_t *parent);
例如下面创建两个页面,然后将第二个页面作为活动页面:
sgl_obj_t *page1 = sgl_obj_create(NULL);
sgl_obj_t *page2 = sgl_obj_create(NULL);
sgl_screen_load(page2);
设置背景色¶
使用sgl_page_set_color()函数设置页面的背景色,函数原型如下:
void sgl_page_set_color(sgl_obj_t* obj, sgl_color_t color);
设置页面背景图片¶
使用sgl_page_set_pixmap()函数设置页面的背景图片,函数原型如下:
void sgl_page_set_pixmap(sgl_obj_t* obj, const sgl_pixmap_t *pixmap);
例如下面创建一个页面,并设置其背景图片为test_pixmap:
extern const unsigned char gImage_test[7080];
const sgl_pixmap_t test_pixmap = {
.width = 60,
.height = 59,
.bitmap = gImage_test,
};
sgl_obj_t *page = sgl_obj_create(NULL);
sgl_page_set_pixmap(page, &test_pixmap);
控件删除¶
在一些情况下,用户需要删除一个控件,可以使用sgl_obj_delete()函数,函数原型如下:
void sgl_obj_delete(sgl_obj_t *obj);
例如下面创建一个按钮,并删除该按钮:
sgl_obj_t *btn = sgl_button_create(NULL);
sgl_obj_set_pos(btn, 10, 10);
sgl_obj_set_size(btn, 100, 50);
.....
sgl_obj_delete(btn);
小技巧
删除控件时,如果该控件有子控件,则子控件也会被删除。如果使用sgl_obj_delete(NULL),则会删除当前活动页面的所有控件,但不会删除该页面。如果使用gl_obj_delete(page1),则会删除page1,并且page1的所有子控件也被删除。
控件层级设置¶
SGL的所有控件不仅仅有父子关系,还有层级关系,即控件的绘制顺序,对于兄弟控件,即父控件下的多个控件,绘制顺序是先绘制先创建的控件,再绘制后创建的控件,从视觉上来说,如果存在重叠,则后创建的控件会覆盖先创建的控件。 用户可以使用sgl_obj_move_up, sgl_obj_move_down, sgl_obj_move_top, sgl_obj_move_bottom函数来设置控件的层级关系,函数原型如下:
void sgl_obj_move_up(sgl_obj_t *obj);
void sgl_obj_move_down(sgl_obj_t *obj);
void sgl_obj_move_top(sgl_obj_t *obj);
void sgl_obj_move_bottom(sgl_obj_t *obj);
sgl_obj_move_up函数用于将控件上移一个层级
sgl_obj_move_down函数用于将控件下移一个层级
sgl_obj_move_top函数用于将控件移到最上层
sgl_obj_move_bottom函数用于将控件移到最下层
备注
上面的函数只能对控件的层级关系有效,不会改变控件的父子关系。如果控件A和控件B的父控件是同一个,则上面的函数是有效的,否则无效。
立刻更新屏幕¶
SGL的屏幕刷新机制是异步的,当用户创建一个控件时,该控件仅仅是添加到了SGL的系统控件树中,并不会立刻刷新,必须等SGL系统滴答时钟触发时,才会刷新屏幕。如果用户此时需要立刻更新屏幕,可以使用sgl_task_handler_sync函数,函数原型如下:
void sgl_task_handler_sync(void);
该函数会立刻绘制一次SGL的系统控件树中的所有控件,并刷新到屏幕上。
控件隐藏和显示¶
使用sgl_obj_set_hidden函数可以隐藏一个控件,函数原型如下:
void sgl_obj_set_hidden(sgl_obj_t *obj);
使用sgl_obj_set_visible函数可以显示一个控件,函数原型如下:
void sgl_obj_set_visible(sgl_obj_t *obj);
设置控件事件回调函数¶
使用sgl_obj_set_event_cb函数设置控件的事件回调函数,函数原型如下:
void sgl_obj_set_event_cb(sgl_obj_t *obj, void (*event_fn)(sgl_event_t *e), size_t data)
该函数用于设置控件的事件回调函数,当用户点击控件时,SGL会调用该回调函数,并传入一个sgl_event_t结构体指针,该结构体中包含了点击事件的信息。 例如下面:
...
void button_event_cb(sgl_event_t *evt)
{
size_t para = evt->param;
switch (evt->type) {
case SGL_EVENT_PRESSED:
printf("Button %d pressed\n", para);
break;
case SGL_EVENT_RELEASED:
printf("Button %d released\n", para);
break;
}
}
...
sgl_obj_t *button = sgl_button_create(NULL);
sgl_obj_set_pos(button, 20, 20);
sgl_obj_set_size(button, 200, 100);
sgl_obj_set_event_cb(button, button_event_cb, xxx_ptr);
...