demo_workbench.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <rtgui/rtgui.h>
  2. #include <rtgui/rtgui_system.h>
  3. #include <rtgui/widgets/view.h>
  4. #include <rtgui/widgets/workbench.h>
  5. static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  6. {
  7. /* 我们目前只对绘制事件感兴趣 */
  8. if (event->type == RTGUI_EVENT_PAINT)
  9. {
  10. struct rtgui_dc* dc;
  11. struct rtgui_rect rect;
  12. /* 获得一个设备上下文 */
  13. dc = rtgui_dc_begin_drawing(widget);
  14. if (dc == RT_NULL) return RT_FALSE; /* 如果获取失败代表什么?这个控件是隐藏的或... */
  15. rtgui_widget_get_rect(widget, &rect); /* 获得控件的可视区域 */
  16. /* 先对所在可视区域全部填充为背景色 */
  17. rtgui_dc_fill_rect(dc, &rect);
  18. /* 绘制一个hello! */
  19. rtgui_dc_draw_text(dc, "hello world", &rect);
  20. /* 通知RTGUI,绘制结束 */
  21. rtgui_dc_end_drawing(dc);
  22. return RT_FALSE;
  23. }
  24. /* 如果不是绘制事件,使用view原来的事件处理函数处理 */
  25. return rtgui_view_event_handler(widget, event);
  26. }
  27. static void workbench_entry(void* parameter)
  28. {
  29. rt_mq_t mq;
  30. struct rtgui_view* view;
  31. struct rtgui_workbench* workbench;
  32. /* 创建GUI应用需要的消息队列 */
  33. mq = rt_mq_create("workbench", 256, 4, RT_IPC_FLAG_FIFO);
  34. /* 注册当前线程为GUI线程 */
  35. rtgui_thread_register(rt_thread_self(), mq);
  36. /* 创建一个工作台 */
  37. workbench = rtgui_workbench_create("main", "workbench");
  38. if (workbench == RT_NULL) return;
  39. /* 创建一个工作台上的一个视图 */
  40. view = rtgui_view_create("view");
  41. rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler);
  42. /* 在工作台上添加一个视图 */
  43. rtgui_workbench_add_view(workbench, view);
  44. /* 显示这个视图 */
  45. rtgui_view_show(view, RT_FALSE);
  46. /* 执行工作台事件循环 */
  47. rtgui_workbench_event_loop(workbench);
  48. /* 去注册GUI线程 */
  49. rtgui_thread_deregister(rt_thread_self());
  50. rt_mq_delete(mq);
  51. }
  52. void workbench_init()
  53. {
  54. static rt_bool_t inited = RT_FALSE;
  55. if (inited == RT_FALSE) /* 避免重复初始化而做的保护 */
  56. {
  57. rt_thread_t tid;
  58. tid = rt_thread_create("wb",
  59. workbench_entry, RT_NULL,
  60. 2048, 25, 10);
  61. if (tid != RT_NULL) rt_thread_startup(tid);
  62. inited = RT_TRUE;
  63. }
  64. }
  65. #ifdef RT_USING_RTGUI
  66. #include <finsh.h>
  67. void workbench()
  68. {
  69. workbench_init();
  70. }
  71. /* finsh的命令输出,可以直接执行workbench()函数以执行上面的函数 */
  72. FINSH_FUNCTION_EXPORT(workbench, workbench demo)
  73. #endif