30. 日历部件

一、日历部件

  日历部件可以展现当前的日期,并帮助用户快速浏览每月的日程安排。日历部件由两个部分组成:主体背景LV_PART_MAIN)和 各个按钮LV_PART_ITEMS)。

  LVGL 官方提供了一些与日历部件相关 API。

lv_obj_t * lv_calendar_create(lv_obj_t * parent);                               // 创建日历部件

void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day);                   // 设置当前的日期
const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj);                                    // 获取当前的日期

void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month);                                // 设置显示的日期
const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj);                                   // 获取当前显示的日期

void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num);      // 设置高亮显示的日期
lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj);                                   // 获取高亮显示的日期
size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj);                                             // 获取高亮显示的日期数量

void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]);       // 设置日历(星期)的名称
lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj);                     // 获取日历的按钮矩阵对象

lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date);                      // 获取当前按下的日期

lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent);               // 创建带有下拉框的日历头
lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent);                  // 创建带有头部箭头的日历头

  在 LVGL 中,用户需要 创建日历部件,可调用 lv_calendar_create() 函数:

/**
 * @brief 创建日历部件
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向日历部件的指针
 */
lv_obj_t * lv_calendar_create(lv_obj_t * parent);

  在默认的情况下,当用户创建出一个日历部件,如果用户需要设置日期,则可以调用 lv_calendar_set_today_date() 函数。

/**
 * @brief 设置当前的日期
 * 
 * @param obj 指向日历控件的指针
 * @param year 年
 * @param month 月
 * @param day 日
 */
void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day);

注意:当前日期并不等同于实时显示的日期。

  如果我们仅仅是设置了当前日期,日期部件并不会自动显示该日期,所以我们必须手动跳转当前日期对应的月份,相关的函数为 lv_calendar_set_shown_date()

/**
 * @brief 设置显示的日期
 * 
 * @param obj 指向日历控件的指针
 * @param year 年
 * @param month 月
 */
void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month);

  我们可以调用 lv_calendar_header_dropdown_create() 函数设置日历头,它是由下拉列表的形式来选择年月份。

/**
 * @brief 创建带有下拉框的日历头
 * 
 * @param parent 指向日历部件的指针
 * @return lv_obj_t* 返回日历头的指针
 */
lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent);

  我们还可以调用 lv_calendar_header_dropdown_create() 函数设置日历头,它可以通过头部的箭头按键调节年月份。

/**
 * @brief 创建带有头部箭头的日历头
 * 
 * @param parent 指向日历部件的指针
 * @return lv_obj_t* 指向日历头的指针
 */
lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent);

  如果用户需要某个日期高亮显示,可调用 lv_calendar_set_highlighted_dates() 函数来进行设置。

/**
 * @brief 设置高亮显示的日期
 * 
 * @param obj 指向日历部件的指针
 * @param highlighted 年
 * @param date_num 月
 */
void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num);

  在默认的情况下,日历都是以英文的形式展示(Su、Mo、Tu、We、Th、Fr 和 Sa),如果用户想设置成中文的日名,可调用 lv_calendar_set_day_names() 函数。

/**
 * @brief 设置日历(星期)的名称
 * 
 * @param obj 指向日历部件的指针
 * @param day_names 指向存放名称的数组指针
 */
void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]);

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

int main(void)
{
    static lv_calendar_date_t highlighted[2];
    const char* day_names[7] = {"7", "1", "2", "3", "4", "5", "6"};
  
    HAL_Init();
    System_Clock_Init(8, 336, 2, 7);
    Delay_Init(168);

    SPI_Simulate_Init();
    // SRAM_Init();
    TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
    __HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE);                          // 清除更新中断标志位
    HAL_TIM_Base_Start_IT(&g_tim6_handle);                                      // 使能更新中断,并启动计数器

    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    // 测试代码
    lv_obj_t *calender = lv_calendar_create(lv_scr_act());                      // 创建日历部件

    lv_obj_center(calender);                                                    // 设置日历部件居中对齐
    lv_obj_set_size(calender, 300, 300);

    lv_calendar_set_today_date(calender, 2024, 3, 1);                           // 设置当前日期
    lv_calendar_set_showed_date(calender, 2024, 3);                             // 设置显示的日期

    lv_calendar_header_arrow_create(calender);                                  // 创建日历头

    highlighted[0].year = 2024;
    highlighted[0].month = 3;
    highlighted[0].day = 5;

    highlighted[1].year = 2024;
    highlighted[1].month = 3;
    highlighted[1].day = 7;

    lv_calendar_set_highlighted_dates(calender, highlighted, 2);                // 设置高亮日期

    lv_calendar_set_day_names(calender, day_names);                             // 设置日名

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
posted @ 2024-08-23 20:58  星光映梦  阅读(17)  评论(0编辑  收藏  举报