demo_view_listctrl.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * 程序清单:label控件演示
  3. *
  4. * 这个例子会在创建出的view上添加几个不同类型的label控件
  5. */
  6. #include "demo_view.h"
  7. #include <rtgui/widgets/label.h>
  8. #include <rtgui/widgets/listctrl.h>
  9. const static struct list_item
  10. {
  11. const char* name;
  12. const char* gender;
  13. int age;
  14. rtgui_image_t* image;
  15. } items[] =
  16. {
  17. {"bernard", "男", 30, RT_NULL},
  18. {"司马光", "男", 1024, RT_NULL},
  19. {"妖姬", "妖", 28, RT_NULL},
  20. };
  21. void _rtgui_listctrl_item_draw(struct rtgui_listctrl *list, struct rtgui_dc* dc, rtgui_rect_t* rect, rt_uint16_t index)
  22. {
  23. char age_str[8];
  24. rtgui_rect_t item_rect;
  25. struct list_item *items, *item;
  26. item_rect = *rect;
  27. item_rect.x1 += 5;
  28. items = (struct list_item*)list->items;
  29. item = &items[index];
  30. if (item->image != RT_NULL)
  31. {
  32. rtgui_image_blit(item->image, dc, &item_rect);
  33. item_rect.x1 += item->image->w + 3;
  34. }
  35. /* draw text */
  36. rtgui_dc_draw_text(dc, item->name, &item_rect); item_rect.x1 += 80;
  37. rtgui_dc_draw_vline(dc, item_rect.x1, item_rect.y1, item_rect.y2);
  38. item_rect.x1 += 5;
  39. rtgui_dc_draw_text(dc, item->gender, &item_rect); item_rect.x1 += 80;
  40. rtgui_dc_draw_vline(dc, item_rect.x1, item_rect.y1, item_rect.y2);
  41. item_rect.x1 += 5;
  42. rt_snprintf(age_str, sizeof(age_str), "%d", item->age);
  43. rtgui_dc_draw_text(dc, age_str, &item_rect);
  44. }
  45. static void on_items(rtgui_widget_t* widget, struct rtgui_event* event)
  46. {
  47. rtgui_listctrl_t* ctrl;
  48. /* get listctrl */
  49. ctrl = RTGUI_LISTCTRL(widget);
  50. /* 打印当前的项 */
  51. rt_kprintf("current item: %d\n", ctrl->current_item);
  52. }
  53. /* 创建用于演示label控件的视图 */
  54. rtgui_view_t* demo_view_listctrl(rtgui_workbench_t* workbench)
  55. {
  56. rtgui_rect_t rect;
  57. rtgui_view_t* view;
  58. rtgui_label_t* label;
  59. rtgui_listctrl_t* box;
  60. /* 先创建一个演示用的视图 */
  61. view = demo_view(workbench, "List Control Demo");
  62. /* 获得视图的位置信息 */
  63. demo_view_get_rect(view, &rect);
  64. rect.x1 += 5;
  65. rect.x2 -= 5;
  66. rect.y1 += 5;
  67. rect.y2 = rect.y1 + 20;
  68. /* 创建一个label控件 */
  69. label = rtgui_label_create("List Control: ");
  70. /* 设置label的位置 */
  71. rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect);
  72. /* view是一个container控件,调用add_child方法添加这个label控件 */
  73. rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(label));
  74. rect.y1 = rect.y2 + 3;
  75. rect.y2 = 250;
  76. box = rtgui_listctrl_create((rt_uint32_t)items, sizeof(items)/sizeof(items[0]), &rect,
  77. _rtgui_listctrl_item_draw);
  78. rtgui_listctrl_set_onitem(box, on_items);
  79. /* view是一个container控件,调用add_child方法添加这个listctrl控件 */
  80. rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(box));
  81. return view;
  82. }