demo_workbench.c 2.7 KB

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