demo_workbench.c 2.7 KB
Newer Older
B
bernard.xiong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>

#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>

static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
	/* 我们目前只对绘制事件感兴趣 */
	if (event->type == RTGUI_EVENT_PAINT)
	{
		struct rtgui_dc* dc;
		struct rtgui_rect rect;

		/* 获得一个设备上下文 */
		dc = rtgui_dc_begin_drawing(widget);
		if (dc == RT_NULL) return RT_FALSE; /* 如果获取失败代表什么?这个控件是隐藏的或... */
		rtgui_widget_get_rect(widget, &rect); /* 获得控件的可视区域 */

		/* 先对所在可视区域全部填充为背景色 */
		rtgui_dc_fill_rect(dc, &rect);

		/* 绘制一个hello! */
		rtgui_dc_draw_text(dc, "hello world", &rect);

		/* 通知RTGUI,绘制结束 */
		rtgui_dc_end_drawing(dc);

		return RT_FALSE;
	}

	/* 如果不是绘制事件,使用view原来的事件处理函数处理 */
	return rtgui_view_event_handler(widget, event);
}

static void workbench_entry(void* parameter)
{
	rt_mq_t mq;
	struct rtgui_view* view;
	struct rtgui_workbench* workbench;

	/* 创建GUI应用需要的消息队列 */
	mq = rt_mq_create("workbench", 256, 4, RT_IPC_FLAG_FIFO);
	/* 注册当前线程为GUI线程 */
	rtgui_thread_register(rt_thread_self(), mq);

	/* 创建一个工作台 */
	workbench = rtgui_workbench_create("main", "workbench");
	if (workbench == RT_NULL) return;

	/* 创建一个工作台上的一个视图 */
	view = rtgui_view_create("view");
	rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler);

	/* 在工作台上添加一个视图 */
	rtgui_workbench_add_view(workbench, view);

B
bernard.xiong 已提交
58 59 60 61 62 63 64 65 66 67
	demo_view_label(workbench);
	demo_view_button(workbench);
	demo_view_checkbox(workbench);
	demo_view_progressbar(workbench);
	demo_view_radiobox(workbench);
	demo_fn_view(workbench);
	demo_view_slider(workbench);

	/* 显示视图 */
	demo_view_show();
B
bernard.xiong 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

	/* 执行工作台事件循环 */
	rtgui_workbench_event_loop(workbench);

	/* 去注册GUI线程 */
	rtgui_thread_deregister(rt_thread_self());
	rt_mq_delete(mq);
}

void workbench_init()
{
	static rt_bool_t inited = RT_FALSE;

	if (inited == RT_FALSE) /* 避免重复初始化而做的保护 */
	{
		rt_thread_t tid;

		tid = rt_thread_create("wb",
			workbench_entry, RT_NULL,
			2048, 25, 10);

		if (tid != RT_NULL) rt_thread_startup(tid);

		inited = RT_TRUE;
	}
}

#ifdef RT_USING_RTGUI
#include <finsh.h>
void workbench()
{
	workbench_init();
}
/* finsh的命令输出,可以直接执行workbench()函数以执行上面的函数 */
FINSH_FUNCTION_EXPORT(workbench, workbench demo)
#endif