10. 复选框部件

一、复选框部件

  复选框部件 由两个部分组成:主体LV_PART_MAIN)和 勾选框LV_PART_INDICATOR),示意图如下:

复选框的组成

  我们可以通过 lv_checkbox_create() 函数来 创建复选框部件

/**
 * @brief 创建复选框部件
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向复选框的指针
 */
lv_obj_t * lv_checkbox_create(lv_obj_t * parent);

  设置复选框部件的文本 函数有两个:lv_checkbox_set_text()lv_checkbox_set_text_static(),前者设置的文本是保存在 动态分配 的内存中的(文本的内存可能会被释放),而后者设置的是 静态 的文本。

/**
 * @brief 动态设置复选框的文本
 * 
 * @param obj 指向复选框的指针
 * @param txt 复选框的文本
 */
void lv_checkbox_set_text(lv_obj_t * obj, const char * txt);

/**
 * @brief 静态设置复选框的文本
 * 
 * @param obj 指向复选框的指针
 * @param txt 复选框的文本,使用 NULL 刷新当前文本
 */
void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt);

  如果我们要 获取复选框的文本,可以通过 lv_checkbox_get_text() 函数获取。

/**
 * @brief 获取复选框的文本
 * 
 * @param obj 指向复选框的指针
 * @return const char* 指向复选框文本的指针
 */
const char * lv_checkbox_get_text(const lv_obj_t * obj);

  我们还可以通过 lv_obj_set_style_pad_column() 函数 设置勾选框与文本之间的间距

/**
 * @brief 设置部件列之间的填充
 * 
 * @param obj 指向复选框的指针
 * @param value 部件列之间填充的间距
 * @param selector 选择样式何时生效
 */
void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);

  复选框的状态有三种:选中未选中 以及 禁用,用户调用 lv_obj_add_state()(添加)和 lv_obj_clear_state()(清除)函数来 设置复选框的状态

void lv_obj_add_state(lv_obj_t * obj, lv_state_t state);

#define lv_obj_clear_state               lv_obj_remove_state
void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state);

二、实验例程

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

lv_obj_t *label;

int main(void)
{
    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();

    // 测试代码
    label = lv_label_create(lv_scr_act());                                      // 创建标签部件
    lv_obj_set_style_text_font(label, &lv_font_montserrat_30, LV_PART_MAIN);    // 设置标签部件的字体样式
    lv_obj_set_align(label, LV_ALIGN_TOP_MID);                                  // 设置标签部件靠上居中对齐
    lv_label_set_text(label, "checkBox test");                                  // 设置标签部件的文本内容

    lv_obj_t *checkBox = lv_checkbox_create(lv_scr_act());                      // 创建复选框部件
    lv_obj_set_style_text_font(checkBox, &lv_font_montserrat_30, LV_PART_MAIN); // 设置复选框部件的文本大小
    lv_obj_set_align(checkBox, LV_ALIGN_CENTER);                                // 设置复选框部件居中对齐
    lv_checkbox_set_text(checkBox, "Sakura");                                   // 设置复选框的文本内容
    lv_obj_set_style_pad_column(checkBox, 10, LV_STATE_DEFAULT);                // 设置复选框的勾选框与文本之间的距离

    lv_obj_add_state(checkBox, LV_STATE_CHECKED);                               // 设置复选框的状态为选中状态

    lv_obj_add_event_cb(checkBox, checkBox_event_cb, LV_EVENT_VALUE_CHANGED, NULL); // 注册复选框的状态改变事件回调函数

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
void checkBox_event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);                                // 获取事件的触发类型
    lv_obj_t *target = lv_event_get_target(e);                                  // 获取事件的触发源
    const char *target_text;

    if (target == checkBox)
    {
        target_text = lv_checkbox_get_text(target);

        if (code == LV_EVENT_VALUE_CHANGED)
        {
            if (lv_obj_has_state(target, LV_STATE_CHECKED))
            {
                lv_label_set_text_fmt(label, "select %s", target_text);
            }
            else
            {
                lv_label_set_text_fmt(label, "unselect %s", target_text);
            }
        }
    }
}
posted @ 2024-06-05 21:17  星光映梦  阅读(14)  评论(0编辑  收藏  举报