gui_demo.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include <rtthread.h>
  2. #if defined(RT_USING_GUIENGINE) && defined(RTGUI_USING_DEMO)
  3. #include <rtgui/rtgui.h>
  4. #include <rtgui/rtgui_system.h>
  5. #include <rtgui/rtgui_app.h>
  6. #include <rtgui/image.h>
  7. #include <rtgui/widgets/window.h>
  8. #include <rtgui/dc.h>
  9. extern const static unsigned char _picture_png[];
  10. static rt_bool_t show_demo(struct rtgui_win *win)
  11. {
  12. struct rtgui_dc *dc;
  13. rtgui_rect_t rect;
  14. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(win));
  15. if (dc == RT_NULL)
  16. {
  17. rt_kprintf("dc is null \n");
  18. return RT_FALSE;
  19. }
  20. rtgui_dc_get_rect(dc, &rect);
  21. /* draw circular */
  22. {
  23. rt_int16_t x, y, r;
  24. x = rect.x2 / 2 / 2;
  25. y = rect.y2 / 2 / 2;
  26. r = x > y ? y : x;
  27. r -= y / 10;
  28. rtgui_dc_draw_circle(dc, x, y, r);
  29. }
  30. /* draw image */
  31. {
  32. rtgui_rect_t draw_rect;
  33. struct rtgui_image *img;
  34. img = rtgui_image_create_from_mem("png", _picture_png, sizeof(_picture_png), RT_TRUE);
  35. if (img != RT_NULL)
  36. {
  37. draw_rect.x1 = rect.x2 / 2 + (rect.x2 / 2 - img->w) / 2;
  38. draw_rect.y1 = (rect.y2 / 2 - img->h) / 2;
  39. draw_rect.x2 = draw_rect.x1 + img->w;
  40. draw_rect.y2 = draw_rect.y1 + img->h;
  41. rtgui_image_blit(img, dc, &draw_rect);
  42. }
  43. }
  44. /* draw text */
  45. {
  46. rtgui_color_t fc;
  47. rtgui_rect_t draw_rect;
  48. char *text_buf = "Hello RT-thread!";
  49. fc = RTGUI_DC_FC(dc);
  50. RTGUI_DC_FC(dc) = RED;
  51. draw_rect.x1 = rect.x2 * 2 / 5;
  52. draw_rect.y1 = rect.y2 * 3 / 4;
  53. draw_rect.x2 = rect.x2;
  54. draw_rect.y2 = rect.y2;
  55. rtgui_dc_draw_text(dc, text_buf, &draw_rect);
  56. RTGUI_DC_FC(dc) = fc;
  57. }
  58. rtgui_dc_end_drawing(dc, RT_TRUE);
  59. return RT_TRUE;
  60. }
  61. rt_bool_t dc_event_handler(struct rtgui_object *object, rtgui_event_t *event)
  62. {
  63. rt_bool_t err;
  64. struct rtgui_win *win = RTGUI_WIN(object);
  65. err = rtgui_win_event_handler(RTGUI_OBJECT(win), event);
  66. if (event->type == RTGUI_EVENT_PAINT)
  67. show_demo(win);
  68. return err;
  69. }
  70. static void rt_gui_demo_entry(void *parameter)
  71. {
  72. struct rtgui_win *main_win;
  73. struct rtgui_app *app;
  74. /* create gui app */
  75. app = rtgui_app_create("gui_demo");
  76. if (app == RT_NULL)
  77. return;
  78. main_win = rtgui_mainwin_create(RT_NULL, "UiWindow", RTGUI_WIN_STYLE_NO_TITLE);
  79. if (main_win == RT_NULL)
  80. {
  81. rtgui_app_destroy(app);
  82. return;
  83. }
  84. rtgui_object_set_event_handler(RTGUI_OBJECT(main_win), dc_event_handler);
  85. rtgui_win_show(main_win, RT_FALSE);
  86. rtgui_app_run(app);
  87. rtgui_win_destroy(main_win);
  88. rtgui_app_destroy(app);
  89. }
  90. int rt_gui_demo_init(void)
  91. {
  92. rt_thread_t tid;
  93. tid = rt_thread_create("mygui",
  94. rt_gui_demo_entry, RT_NULL,
  95. 2048, 25, 10);
  96. if (tid != RT_NULL)
  97. rt_thread_startup(tid);
  98. return 0;
  99. }
  100. INIT_APP_EXPORT(rt_gui_demo_init);
  101. #endif /* RT_USING_RTGUI */