demo_gui_main.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * 这个一个RTGUI的例子,演示了如何创建一个RTGUI程序
  3. * 在rtgui_win这个分支中,没有toplevel控件,默认panel
  4. * 作为toplevel级别控件,可以把它看作一个“桌面”
  5. */
  6. #include <rtthread.h>
  7. #include <rtgui/rtgui.h>
  8. #include <panel.h>
  9. #include <rtgui/event.h>
  10. #include <rtgui/widgets/widget.h>
  11. #include <rtgui/widgets/button.h>
  12. #include <rtgui/widgets/textbox.h>
  13. #include <rtgui/widgets/view.h>
  14. #include <rtgui/widgets/listbox.h>
  15. #include <rtgui/rtgui_theme.h>
  16. void demo_gui_win(PVOID wdt, rtgui_event_t *event);
  17. rtgui_listbox_t *__lbox;
  18. static rtgui_listbox_item_t _demo_list[] =
  19. {
  20. {"item1", RT_NULL},
  21. {"item2", RT_NULL},
  22. };
  23. /* 给列表添加一个项目 */
  24. void user_add_one_item(PVOID wdt, rtgui_event_t *event)
  25. {
  26. rtgui_listbox_item_t item={"new item", RT_NULL};
  27. if(__lbox != RT_NULL)
  28. {
  29. __lbox->add_item(__lbox, &item);
  30. }
  31. }
  32. static void rtgui_panel_entry(void* parameter)
  33. {
  34. const struct rtgui_graphic_driver* gd = rtgui_graphic_driver_get_default();
  35. struct rt_messagequeue* mq;
  36. rtgui_panel_t *panel;
  37. rtgui_view_t *view;
  38. rtgui_button_t *button;
  39. /* 创建GUI应用需要的消息队列 */
  40. mq = rt_mq_create("Panel", 256, 32, RT_IPC_FLAG_FIFO);
  41. /* 注册当前线程为GUI线程 */
  42. rtgui_thread_register(rt_thread_self(), mq);
  43. panel = rtgui_panel_create(0,0,gd->width,gd->height);
  44. //创建一个标题/信息栏
  45. view = rtgui_view_create(panel,"titlebar",0,0,gd->width,30);
  46. rtgui_widget_set_style(view, RTGUI_BORDER_SIMPLE);
  47. rtgui_label_create(view, "hello world!",5,2,150,24);
  48. //创建一个列表
  49. __lbox = rtgui_listbox_create(panel,10,30,120,100,RTGUI_BORDER_SUNKEN);
  50. rtgui_listbox_set_items(__lbox,_demo_list,RT_COUNT(_demo_list));
  51. button = rtgui_button_create(panel,"add",140,60,50,25);
  52. rtgui_button_set_onbutton(button,user_add_one_item);
  53. //创建一个编辑框
  54. rtgui_textbox_create(panel,
  55. "this is a textbox,\n"
  56. "demo multi text.\n",
  57. 10,150,180,50,
  58. RTGUI_TEXTBOX_MULTI);
  59. button = rtgui_button_create(panel, "win",140,90,50,25);
  60. rtgui_button_set_onbutton(button,demo_gui_win);
  61. ///////////////////////////////////////////////////////
  62. rtgui_panel_show(panel);
  63. /* 执行工作台事件循环 */
  64. rtgui_panel_event_loop(panel);
  65. /* 去注册GUI线程 */
  66. rtgui_thread_deregister(rt_thread_self());
  67. rt_mq_delete(mq);
  68. }
  69. void rtgui_panel_init(void)
  70. {
  71. static rt_bool_t main_inited = RT_FALSE;
  72. if(main_inited == RT_FALSE) /* 避免重复初始化而做的保护 */
  73. {
  74. struct rt_thread* tid;
  75. tid = rt_thread_create("Panel", rtgui_panel_entry, RT_NULL, 4096, 4, 5);
  76. if(tid != RT_NULL) rt_thread_startup(tid);
  77. main_inited = RT_TRUE;
  78. }
  79. }