demo_gui_window.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * 程序清单:窗口演示
  3. *
  4. * 这个例子会先创建出一个演示用的view,当点击上面的按钮时会不同的模式创建窗口
  5. */
  6. #include <rtgui/rtgui.h>
  7. #include <rtgui/rtgui_system.h>
  8. #include <rtgui/widgets/window.h>
  9. #include <rtgui/widgets/label.h>
  10. #include <rtgui/widgets/button.h>
  11. #include "demo_view.h"
  12. #include <string.h>
  13. static rtgui_timer_t *timer;
  14. static char label_text[80];
  15. static rt_uint8_t cnt = 5;
  16. /* 获取一个递增的窗口标题 */
  17. static char* get_win_title(void)
  18. {
  19. static rt_uint8_t win_no = 0;
  20. static char win_title[16];
  21. rt_sprintf(win_title, "win %d", ++win_no);
  22. return win_title;
  23. }
  24. rt_bool_t auto_window_close(PVOID wdt, rtgui_event_t* event)
  25. {
  26. if(timer != RT_NULL)
  27. {
  28. rtgui_timer_stop(timer);
  29. rtgui_timer_destory(timer);
  30. }
  31. return RT_TRUE;
  32. }
  33. /* 关闭对话框时的回调函数 */
  34. void diag_close(struct rtgui_timer* timer, void* parameter)
  35. {
  36. rtgui_label_t *label;
  37. label = (rtgui_label_t*)parameter;
  38. cnt --;
  39. rt_sprintf(label_text, "closed then %d s", cnt);
  40. /* 设置标签文本并更新控件 */
  41. rtgui_label_set_text(label, label_text);
  42. rtgui_widget_update(RTGUI_WIDGET(label));
  43. if (cnt == 0)
  44. {
  45. rtgui_win_t *win;
  46. win = rtgui_win_get_win_by_widget(label);
  47. if(win == RT_NULL) return;
  48. /* 超时,关闭对话框 */
  49. rtgui_win_close(win, RT_NULL);
  50. /* 停止并删除定时器 */
  51. rtgui_timer_stop(timer);
  52. rtgui_timer_destory(timer);
  53. }
  54. }
  55. static rt_uint16_t delta_x = 20;
  56. static rt_uint16_t delta_y = 40;
  57. /* 触发正常窗口显示 */
  58. static void demo_win_onbutton(PVOID wdt, rtgui_event_t* event)
  59. {
  60. rtgui_win_t *win;
  61. PVOID parent;
  62. rtgui_rect_t rect={0, 0, 180, 120};
  63. parent = rtgui_widget_get_toplevel(wdt);
  64. rtgui_rect_moveto(&rect, delta_x, delta_y);
  65. delta_x += 20;
  66. delta_y += 20;
  67. /* 创建一个窗口 */
  68. win = rtgui_win_create(parent, get_win_title(), &rect, RTGUI_WIN_DEFAULT);
  69. /* 添加一个文本标签 */
  70. rtgui_label_create(win, "这是一个普通窗口", 10, 30, 150, 20);
  71. /* 非模态显示窗口 */
  72. rtgui_win_show(win, RT_FALSE);
  73. }
  74. /* 触发自动窗口显示 */
  75. static void demo_autowin_onbutton(PVOID wdt, rtgui_event_t* event)
  76. {
  77. PVOID parent;
  78. rtgui_label_t *label = RT_NULL;
  79. rtgui_win_t *msgbox;
  80. struct rtgui_rect rect ={50, 50, 200, 200};
  81. parent = rtgui_widget_get_toplevel(wdt);
  82. msgbox = rtgui_win_create(parent, "Information", &rect, RTGUI_WIN_DEFAULT);
  83. if (msgbox != RT_NULL)
  84. {
  85. cnt = 5;
  86. rt_sprintf(label_text, "closed then %d s", cnt);
  87. label = rtgui_label_create(msgbox, label_text, 10,30,120,20);
  88. /* 设置关闭窗口时的动作 */
  89. rtgui_win_set_onclose(msgbox, auto_window_close);
  90. rtgui_win_show(msgbox, RT_FALSE);
  91. }
  92. /* 创建一个定时器 */
  93. timer = rtgui_timer_create(100, RT_TIMER_FLAG_PERIODIC, diag_close, label);
  94. rtgui_timer_start(timer);
  95. }
  96. /* 触发模态窗口显示 */
  97. static void demo_modalwin_onbutton(PVOID wdt, rtgui_event_t* event)
  98. {
  99. rtgui_win_t *win;
  100. PVOID parent;
  101. rtgui_rect_t rect = {0, 0, 180, 120};
  102. parent = rtgui_widget_get_toplevel(wdt);
  103. rtgui_rect_moveto(&rect, (rtgui_widget_get_width(parent) -180)/2,
  104. (rtgui_widget_get_height(parent)-120)/2);
  105. /* 创建一个窗口 */
  106. win = rtgui_win_create(parent,get_win_title(), &rect, RTGUI_WIN_DEFAULT);
  107. rect.x1 += 20;
  108. rect.x2 -= 5;
  109. rect.y1 += 5;
  110. rect.y2 = rect.y1 + 20;
  111. rtgui_label_create(win, "这是一个模式窗口", 20, 30, 150,20);
  112. /* 模态显示窗口 */
  113. rtgui_win_show(win, RT_TRUE);
  114. }
  115. /* 触发无标题窗口显示 */
  116. static void demo_ntitlewin_onbutton(PVOID wdt, rtgui_event_t* event)
  117. {
  118. rtgui_win_t *win;
  119. rtgui_label_t *label;
  120. rtgui_button_t *button;
  121. PVOID parent;
  122. rtgui_rect_t rect = {0, 0, 180, 120};
  123. parent = rtgui_widget_get_toplevel(wdt);
  124. rtgui_rect_moveto(&rect, delta_x, delta_y);
  125. delta_x += 20;
  126. delta_y += 20;
  127. /* 创建一个窗口,风格为无标题及无边框 */
  128. win = rtgui_win_create(parent,"no title", &rect, RTGUI_WIN_DEFAULT);
  129. RTGUI_WIDGET_BACKGROUND(win) = white;
  130. win->level = RTGUI_WIN_LEVEL_EXPERT;
  131. /* 创建一个文本标签 */
  132. label = rtgui_label_create(win, "无标题栏窗口", 10, 30, 100, 20);
  133. RTGUI_WIDGET_BACKGROUND(label) = white;
  134. button = rtgui_button_create(win,"关闭", 65, 85, 60, 25);
  135. rtgui_button_set_onbutton(button, rtgui_win_close);
  136. /* 非模态显示窗口 */
  137. rtgui_win_show(win, RT_FALSE);
  138. }
  139. rtgui_view_t* demo_gui_window(rtgui_view_t* parent_view)
  140. {
  141. rtgui_view_t* view;
  142. rtgui_button_t *button;
  143. /* 创建一个演示用的视图 */
  144. view = demo_view_create(parent_view, "Window Demo");
  145. button = rtgui_button_create(view, "Normal Win", 10, 40, 100, 25);
  146. rtgui_button_set_onbutton(button, demo_win_onbutton);
  147. button = rtgui_button_create(view, "Auto Win", 10, 70, 100, 25);
  148. rtgui_button_set_onbutton(button, demo_autowin_onbutton);
  149. button = rtgui_button_create(view, "Modal Win", 10, 100, 100, 25);
  150. rtgui_button_set_onbutton(button, demo_modalwin_onbutton);
  151. button = rtgui_button_create(view, "NoTitle Win", 10, 130, 100, 25);
  152. rtgui_button_set_onbutton(button, demo_ntitlewin_onbutton);
  153. return view;
  154. }