rt-thread-official/examples/gui/demo_workbench.c

108 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/workbench.h>
static rt_bool_t demo_workbench_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
/* 我们目前只对按键事件感兴趣。如果当前workbench处于模式显示状态忽略它 */
if ((event->type == RTGUI_EVENT_KBD) && !RTGUI_WORKBENCH_IS_MODAL_MODE(RTGUI_WORKBENCH(widget)))
{
struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
if (ekbd->type == RTGUI_KEYDOWN)
{
if (ekbd->key == RTGUIK_RIGHT)
{
demo_view_next(RT_NULL, RT_NULL);
return RT_TRUE;
}
else if (ekbd->key == RTGUIK_LEFT)
{
demo_view_prev(RT_NULL, RT_NULL);
return RT_TRUE;
}
}
}
/* 如果不是绘制事件使用view原来的事件处理函数处理 */
return rtgui_workbench_event_handler(widget, event);
}
static void workbench_entry(void* parameter)
{
rt_mq_t mq;
struct rtgui_view* view;
struct rtgui_workbench* workbench;
/* 创建GUI应用需要的消息队列 */
#ifdef RTGUI_USING_SMALL_SIZE
mq = rt_mq_create("workbench", 32, 8, RT_IPC_FLAG_FIFO);
#else
mq = rt_mq_create("workbench", 256, 8, RT_IPC_FLAG_FIFO);
#endif
/* 注册当前线程为GUI线程 */
rtgui_thread_register(rt_thread_self(), mq);
/* 创建一个工作台 */
workbench = rtgui_workbench_create("main", "workbench");
if (workbench == RT_NULL) return;
rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), demo_workbench_event_handler);
/* 初始化各个例子的视图 */
demo_view_dc(workbench);
demo_view_animation(workbench);
demo_view_window(workbench);
demo_view_label(workbench);
demo_view_button(workbench);
demo_view_checkbox(workbench);
demo_view_progressbar(workbench);
demo_view_radiobox(workbench);
demo_view_textbox(workbench);
demo_view_slider(workbench);
demo_view_mywidget(workbench);
demo_view_image(workbench);
demo_listview_view(workbench);
demo_fn_view(workbench);
/* 显示视图 */
demo_view_show();
/* 执行工作台事件循环 */
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