栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

TUI控件消息触发和系统消息发送 <二>

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TUI控件消息触发和系统消息发送 <二>

描述TUISYS (tuisys) - Gitee.com

在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里面的逻辑和视图代码可以跨平台使用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993243.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号