在TUI运行只需要3个函数,TUI系统就可以运行,不依赖任何,如下:
int main(int argc, char** argv)
{
tui_start_init("../../res.disk", -1, -1);
while (1) {
tui_run_loop();
}
tui_end_uninit();
}
初始化运行后,UI什么都没有显示,如果要显示视图就需要创建视图,注册系统消息函数,使界面逻辑跑起来。
系统消息函数用户通过消息函数注册int32_t tui_sys_msg_reg(tui_sys_msg_cb_t cb);传进参数cb回调函数,回调函数就可以接收int32_t tui_sys_msg_send(uint32_t cmd, void *param0, void *param1);发送的消息。
消息发送是广播的形式,所以只要注册了消息回调的函数的都能收到消息。消息注册的函数如果不使用,要及时释放,避免资源浪费。
目前系统消息统一在./includes/sys_msg_def.h里面管理,方便应用。
在工具里面我们选择了回调函数,会自动生成对应的代码,当控件触发后,回调函数会被调用
为了使软件达到逻辑视图分离,我们里面使用控件消息触发,发送系统消息,接收系统消息,最后处理消息。
第一步,创建一个.appshomehome.c,初始化TUI,注册系统消息函数,创建视图,运行,最后退出,代码如下:#include "tui.h"
extern tui_obj_t * home_main_view_view_create(void);
static int32_t home_sys_msg_cb(uint32_t cmd, void *param0, void *param1)
{
switch (cmd)
{
case TUI_USER_MSG_APP_HELLO:
printf("hello: %dn", param0);
break;
default:
break;
}
}
int home_create(char *res_path)
{
tui_start_init(res_path, -1, -1);
#ifdef TUI_COMPONENT_ENABEL
tui_com_reg_func_map();
#endif
tui_sys_msg_reg(home_sys_msg_cb);
home_main_view_view_create();
while (1) {
tui_run_loop();
}
tui_end_uninit();
return 0;
}
第二步,在.includessys_msg_def.h里面增加一个消息枚举,供home.c系统回调函数使用home_sys_msg_cb
#ifndef __SYS_MSG_DEF_H__
#define __SYS_MSG_DEF_H__
typedef enum {
TUI_SYS_MSG_VIEW_CREATE = 0x1000,
TUI_USER_MSG_DEF_OK = 0x2000,
TUI_USER_MSG_DEF_CANCEL,
TUI_USER_MSG_APP_HELLO,//add test
TUI_USER_MSG_MAX,
} tui_sys_msg_def_e;
#endif
第三步,为了实现跨平台,需要改造平台的入口函数.platformvc++main.c,调用home.c函数home_create()
#ifdef WIN32
#include "tui.h"
int home_create(char *res_path);
int main(int argc, char** argv)
{
if (argc > 3) {
#ifdef TUI_COMPONENT_ENABEL
tui_com_reg_func_map();
#endif
tui_start_init(argv[1], -1, -1);
tui_view_create(argv[2], NULL);
while (1) {
tui_run_loop();
}
tui_end_uninit();
} else {
home_create("../../res.disk");
return 0;
}
}
#endif
第四步,在工具生成的.appshomeviewmain_view.c,添加按键触发函数,发送系统消息
#include "tui.h"
tui_obj_t *home_main_view_view_obj;
static void button_2_cb_2(tui_obj_t *obj, tui_event_e event) {
tui_sys_msg_send(TUI_USER_MSG_APP_HELLO, (void*)event, NULL);
}
static void label_3_cb_3(tui_obj_t *obj, tui_event_e event) {
}
static tui_map_cb_t cb_map[] = {
{ HOME_MAIN_VIEW_BUTTON_2, (void*)button_2_cb_2 },
{ HOME_MAIN_VIEW_LABEL_3, (void*)label_3_cb_3 },
{ 0, (void*)0 }
};
tui_obj_t * home_main_view_view_create(void){
home_main_view_view_obj = 0;
home_main_view_view_obj = tui_view_create("V:/layout/home/main_view.bin", cb_map);
return home_main_view_view_obj;
}
运行效果如下,打印按键发送的消息
注意
通过UIStudio工具创建工程的时候, main_view.c 和 home.c 没有增加到VC++工程里面,需要手动增加到工程里面参加编译。
上面实例看起来有点麻烦,主要是为了实现视图和逻辑的分离,其中还有平台的分离。
不同嵌入式平台只需要修改.platform下面对应平台的文件,.apps里面的逻辑和视图代码可以跨平台使用。



