demo_gui_win.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * 这个例子演示了如何在一个线程中创建一个win
  3. */
  4. #include <rtthread.h>
  5. #include <rtgui/rtgui.h>
  6. #include <rtgui/event.h>
  7. #include <rtgui/driver.h>
  8. #include <rtgui/widgets/label.h>
  9. #include <rtgui/widgets/button.h>
  10. #include <rtgui/widgets/radiobox.h>
  11. #include <rtgui/widgets/window.h>
  12. static rt_bool_t demo_win_inited = RT_FALSE;
  13. static rt_bool_t demo_gui_win_event_handler(PVOID wdt, rtgui_event_t* event)
  14. {
  15. if(event->type == RTGUI_EVENT_PAINT)
  16. {
  17. }
  18. /* 其他事件使用win默认的事件处理函数处理 */
  19. return rtgui_win_event_handler(wdt, event);
  20. }
  21. static void gui_win_entry(void* parameter)
  22. {
  23. const struct rtgui_graphic_driver* gd = rtgui_graphic_driver_get_default();
  24. struct rt_messagequeue *mq;
  25. rtgui_win_t *win;
  26. rtgui_button_t *button;
  27. rtgui_point_t p;
  28. rtgui_rect_t rect = {0,0,200,180};
  29. rtgui_label_t *label;
  30. rtgui_font_t *font;
  31. /* 创建GUI应用需要的消息队列 */
  32. mq = rt_mq_create("demo_win", 256, 32, RT_IPC_FLAG_FIFO);
  33. /* 注册当前线程 */
  34. rtgui_thread_register(rt_thread_self(), mq);
  35. /* 窗口居中 */
  36. rtgui_rect_moveto(&rect, (gd->width - rtgui_rect_width(rect))/2, (gd->height - rtgui_rect_height(rect))/2);
  37. /* 创建窗口 */
  38. win = rtgui_win_create(RT_NULL,"demo_win",&rect,RTGUI_WIN_DEFAULT);
  39. if(win == RT_NULL) return;
  40. /* 取得客户区坐标零点 */
  41. p = rtgui_win_get_client_zero(win);
  42. label = rtgui_label_create(win, "hello world!", p.x+5, p.y+5, 100,25);
  43. font = rtgui_font_refer("asc", 12);
  44. RTGUI_WIDGET_FONT(label) = font;
  45. button = rtgui_button_create(win, "Exit", (rtgui_rect_width(rect)-50)/2,
  46. rtgui_rect_height(rect)-40,50,25);
  47. rtgui_button_set_onbutton(button,rtgui_win_close);
  48. rtgui_widget_set_event_handler(win, demo_gui_win_event_handler);
  49. rtgui_win_show(win,RT_FALSE);
  50. /* 执行工作台事件循环 */
  51. rtgui_win_event_loop(win);
  52. demo_win_inited = RT_FALSE;
  53. /* 去注册GUI线程 */
  54. rtgui_thread_deregister(rt_thread_self());
  55. rt_mq_delete(mq);
  56. }
  57. void demo_gui_win(PVOID wdt, rtgui_event_t *event)
  58. {
  59. if(demo_win_inited == RT_FALSE) /* 避免重复初始化而做的保护 */
  60. {
  61. struct rt_thread* tid;
  62. tid = rt_thread_create("demo_win", gui_win_entry, RT_NULL, 1024, 5, 10);
  63. if(tid != RT_NULL) rt_thread_startup(tid);
  64. demo_win_inited = RT_TRUE;
  65. }
  66. }