1
0

demo_gui_main.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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/view.h>
  13. #include <rtgui/rtgui_theme.h>
  14. #include "demo_view.h"
  15. /* 用于存放演示视图的数组,最多可创建32个演示视图 */
  16. static rtgui_view_t* demo_list[32];
  17. /* 当前演示视图索引 */
  18. static rt_uint16_t demo_current = 0;
  19. /* 总共包括的演示视图数目 */
  20. static rt_uint16_t demo_number = 0;
  21. /* 显示前一个演示视图 */
  22. void demo_gui_prev(PVOID wdt, rtgui_event_t *event)
  23. {
  24. rtgui_panel_t *panel = rtgui_panel_get();
  25. if (demo_current != 0)
  26. {
  27. RTGUI_WIDGET_HIDE(demo_list[demo_current]);
  28. demo_current --;
  29. RTGUI_WIDGET_UNHIDE(demo_list[demo_current]);
  30. rtgui_panel_update_clip(panel);
  31. rtgui_panel_redraw(&RTGUI_WIDGET_EXTENT(demo_list[demo_current]));
  32. }
  33. }
  34. /* 显示下一个演示视图 */
  35. void demo_gui_next(PVOID wdt, rtgui_event_t *event)
  36. {
  37. rtgui_panel_t *panel = rtgui_panel_get();
  38. if (demo_current + 1< demo_number)
  39. {
  40. RTGUI_WIDGET_HIDE(demo_list[demo_current]);
  41. demo_current ++;
  42. RTGUI_WIDGET_UNHIDE(demo_list[demo_current]);
  43. rtgui_panel_update_clip(panel);
  44. rtgui_panel_redraw(&RTGUI_WIDGET_EXTENT(demo_list[demo_current]));
  45. }
  46. }
  47. rtgui_view_t* demo_view_create(rtgui_view_t* parent_view, const char* title)
  48. {
  49. rtgui_view_t* view;
  50. /* 设置视图的名称 */
  51. view = rtgui_view_create(parent_view, title, 0,0,
  52. rtgui_widget_get_width(parent_view),
  53. rtgui_widget_get_height(parent_view));
  54. if (view == RT_NULL) return RT_NULL;
  55. rtgui_widget_set_style(view, RTGUI_BORDER_SIMPLE);
  56. RTGUI_WIDGET_HIDE(view);
  57. /* 创建标题用的标签 */
  58. rtgui_label_create(view, title, 10, 5, 200, 20);
  59. /* 创建一个水平的staticline线 */
  60. rtgui_staticline_create(view, 10, 30, 2, rtgui_widget_get_width(view)-20, RTGUI_HORIZONTAL);
  61. /* 创建成功后,添加到数组中 */
  62. demo_list[demo_number] = view;
  63. demo_number ++;
  64. return view;
  65. }
  66. static void rtgui_panel_entry(void* parameter)
  67. {
  68. const struct rtgui_graphic_driver* gd = rtgui_graphic_driver_get_default();
  69. struct rt_messagequeue* mq;
  70. rtgui_panel_t *panel;
  71. rtgui_view_t *view;
  72. rtgui_button_t *button;
  73. /* 创建GUI应用需要的消息队列 */
  74. mq = rt_mq_create("Panel", 256, 32, RT_IPC_FLAG_FIFO);
  75. /* 注册当前线程为GUI线程 */
  76. rtgui_thread_register(rt_thread_self(), mq);
  77. panel = rtgui_panel_create(0,0,gd->width,gd->height);
  78. //{{{ TODO: START ADD CODE HERE.
  79. view = rtgui_view_create(panel, "demo_view", 5, 5, gd->width-10,gd->height-40);
  80. button = rtgui_button_create(panel, "Prev", 5,gd->height-30,50,25);
  81. rtgui_button_set_onbutton(button, demo_gui_prev);
  82. button = rtgui_button_create(panel, "Next", gd->width-55,gd->height-30,50,25);
  83. rtgui_button_set_onbutton(button, demo_gui_next);
  84. /* 初始化各个例子的视图 */
  85. #if RT_VERSION == 4
  86. demo_gui_benchmark(view);
  87. #endif
  88. /* demo_view_dc(view);
  89. #if RT_VERSION == 4
  90. #ifdef RTGUI_USING_TTF
  91. demo_view_ttf(view);
  92. #endif
  93. #endif */
  94. #ifndef RTGUI_USING_SMALL_SIZE
  95. demo_gui_dc_buffer(view);
  96. #endif
  97. demo_gui_animation(view);
  98. #ifndef RTGUI_USING_SMALL_SIZE
  99. demo_gui_buffer_animation(view);
  100. #endif
  101. demo_gui_window(view);
  102. demo_gui_label(view);
  103. demo_gui_button(view);
  104. demo_gui_checkbox(view);
  105. demo_gui_progressbar(view);
  106. demo_gui_scrollbar(view);
  107. demo_gui_radiobox(view);
  108. demo_gui_textbox(view);
  109. demo_gui_listbox(view);
  110. demo_gui_menu(view);
  111. demo_gui_listctrl(view);
  112. demo_gui_combobox(view);
  113. demo_gui_slider(view);
  114. #if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
  115. demo_gui_image(view);
  116. #endif
  117. #ifdef RT_USING_MODULE
  118. #if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
  119. demo_gui_module(view);
  120. #endif
  121. #endif
  122. /* demo_gui_listview(view); */
  123. /* demo_gui_listview_icon(view); */
  124. #if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
  125. demo_gui_fnview(view);
  126. #endif
  127. demo_gui_rttab(view);
  128. rtgui_view_show(demo_list[demo_current]);
  129. //}}} END ADD CODE.
  130. rtgui_panel_show(panel);
  131. /* 执行工作台事件循环 */
  132. rtgui_panel_event_loop(panel);
  133. /* 去注册GUI线程 */
  134. rtgui_thread_deregister(rt_thread_self());
  135. rt_mq_delete(mq);
  136. }
  137. void rtgui_panel_init(void)
  138. {
  139. static rt_bool_t main_inited = RT_FALSE;
  140. if(main_inited == RT_FALSE) /* 避免重复初始化而做的保护 */
  141. {
  142. struct rt_thread* tid;
  143. tid = rt_thread_create("Panel", rtgui_panel_entry, RT_NULL, 4096, 4, 5);
  144. if(tid != RT_NULL) rt_thread_startup(tid);
  145. main_inited = RT_TRUE;
  146. }
  147. }