demo_workbench.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. demo_view_window(workbench);
  45. demo_view_label(workbench);
  46. demo_view_button(workbench);
  47. demo_view_checkbox(workbench);
  48. demo_view_progressbar(workbench);
  49. demo_view_radiobox(workbench);
  50. demo_fn_view(workbench);
  51. demo_view_slider(workbench);
  52. /* 显示视图 */
  53. demo_view_show();
  54. /* 执行工作台事件循环 */
  55. rtgui_workbench_event_loop(workbench);
  56. /* 去注册GUI线程 */
  57. rtgui_thread_deregister(rt_thread_self());
  58. rt_mq_delete(mq);
  59. }
  60. void workbench_init()
  61. {
  62. static rt_bool_t inited = RT_FALSE;
  63. if (inited == RT_FALSE) /* 避免重复初始化而做的保护 */
  64. {
  65. rt_thread_t tid;
  66. tid = rt_thread_create("wb",
  67. workbench_entry, RT_NULL,
  68. 2048, 25, 10);
  69. if (tid != RT_NULL) rt_thread_startup(tid);
  70. inited = RT_TRUE;
  71. }
  72. }
  73. #ifdef RT_USING_RTGUI
  74. #include <finsh.h>
  75. void workbench()
  76. {
  77. workbench_init();
  78. }
  79. /* finsh的命令输出,可以直接执行workbench()函数以执行上面的函数 */
  80. FINSH_FUNCTION_EXPORT(workbench, workbench demo)
  81. #endif