LVGL:拓展部件——日历 lv_calendar

news2024/11/25 1:07:44

一、概述

此控件特点:

  • 以7x7矩阵的形式展示任何一个月的日期,即在一个7行7列的网格中呈现。
  • 显示星期的名称,即每一列对应一个特定的星期几(如周一、周二等)。
  • 高亮显示当前日期(即今天)。
  • 支持高亮用户自定义的日期,允许用户突出显示特定的日期以供关注或标记。

二、部件和样式

2.1、使用底层按钮矩阵(lv_btnmatrix)对象

此控件内部采用了 lv_btnmatrix 对象作为基础结构,以此来组织和排列日历中的日期及星期名称,形成一个矩阵布局。

2.2、包含组件元素

  • LV_PART_MAIN:日历的整体背景。
  • LV_PART_ITEMS:日历中的具体日期以及星期名称。由于底层采用 lv_btnmatrix,每个日期和星期名称都表现为一个按钮。针对这些按钮,设置了特定的控制标志和添加了自定义绘制事件,以实现特定的样式效果。

三、相关函数

1、void lv_calendar_set_today_date(lv_obj_t *obj, uint32_t year, uint32_t month, uint32_t day)

设置当前日期。

2、void lv_calendar_set_showed_date(lv_obj_t *obj, uint32_t year, uint32_t month)

显示的年份和月份。

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_obj_set_size(obj, 300, 300);
    lv_obj_center(obj);
    lv_calendar_set_showed_date(obj, 2024, 4);

3、void lv_calendar_set_highlighted_dates(lv_obj_t *obj, lv_calendar_date_t highlighted[], uint16_t date_num)

设置日历控件特定日期高亮显示。参数3是要高亮显示的日期数量。

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_obj_set_size(obj, 300, 300);
    lv_obj_center(obj);
    lv_calendar_set_showed_date(obj, 2024, 4);

    static lv_calendar_date_t highlighted_dates[] =
    {
        { .year = 2024, .month = 4, .day = 9 },
        { .year = 2024, .month = 4, .day = 21 },
        { .year = 2024, .month = 4, .day = 26 }
    };

    lv_calendar_set_highlighted_dates(obj, highlighted_dates, 3);

4、void lv_calendar_set_day_names(lv_obj_t *obj, const char **day_names)

设置星期名称。

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_obj_set_size(obj, 600, 300);
    lv_obj_center(obj);
    lv_calendar_set_showed_date(obj, 2024, 4);

    static lv_calendar_date_t highlighted_dates[] =
    {
        { .year = 2024, .month = 4, .day = 9 },
        { .year = 2024, .month = 4, .day = 21 },
        { .year = 2024, .month = 4, .day = 26 }
    };

    lv_calendar_set_highlighted_dates(obj, highlighted_dates, 3);

    lv_obj_set_style_text_font(obj,&lv_font_siyuanheiti16,LV_PART_MAIN);

    static const char *day_names[] =
    {
        "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
    };

    lv_calendar_set_day_names(obj, day_names);

5、lv_obj_t *lv_calendar_get_btnmatrix(const lv_obj_t *obj)

获取其内部用于显示日期和星期名称的按钮矩阵。

6、const lv_calendar_date_t *lv_calendar_get_today_date(const lv_obj_t *calendar)

获取今天的日期。

7、const lv_calendar_date_t *lv_calendar_get_showed_date(const lv_obj_t *calendar)

获取当前显示的日期,即用户当前看到的年份、月份组合。

8、lv_calendar_date_t *lv_calendar_get_highlighted_dates(const lv_obj_t *calendar)

获取所有高亮日期。

9、uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t *calendar)

获取高亮显示日期数量。

10、lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent)

设置箭头形式的日历头。

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_obj_set_size(obj, 600, 300);
    lv_obj_center(obj);
    lv_calendar_set_showed_date(obj, 2024, 4);

    static lv_calendar_date_t highlighted_dates[] =
    {
        { .year = 2024, .month = 4, .day = 9 },
        { .year = 2024, .month = 4, .day = 21 },
        { .year = 2024, .month = 4, .day = 26 }
    };

    lv_calendar_set_highlighted_dates(obj, highlighted_dates, 3);

    lv_obj_set_style_text_font(obj,&lv_font_siyuanheiti16,LV_PART_MAIN);

    static const char *day_names[] =
    {
        "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
    };

    lv_calendar_set_day_names(obj, day_names);
    lv_calendar_header_arrow_create(obj);

11、lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent)

设置下拉列表形式的日历头。

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    static const char *day_names[] =
        {
            "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
        };

    lv_calendar_set_day_names(obj, day_names);

    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_calendar_set_showed_date(obj, 2024, 02);

    lv_obj_set_size(obj, 600, 300);
    lv_obj_center(obj);

    static lv_calendar_date_t highlighted_dates[] =
    {
        { .year = 2024, .month = 4, .day = 9 },
        { .year = 2024, .month = 4, .day = 21 },
        { .year = 2024, .month = 4, .day = 26 }
    };

    lv_calendar_set_highlighted_dates(obj, highlighted_dates, 3);

    lv_obj_set_style_text_font(obj,&lv_font_siyuanheiti16,LV_PART_MAIN);

    lv_calendar_header_dropdown_create(obj);
    lv_calendar_set_showed_date(obj, 2024, 04);

可能需要在源码添加年份:

这里也要改成最新年份: 

12、 lv_res_t lv_calendar_get_pressed_date(const lv_obj_t *calendar, lv_calendar_date_t *date)

获取日历控件当前被按下的日期。

返回值:

  • LV_RES_OK:有一个有效的按下日期。参数2已填充了当前被按下的日期信息。
  • LV_RES_INV:当前没有被按下的日期。可能是用户未进行任何按压操作,或者已取消了之前的按压状态。
static void event_handler3(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_current_target(e);

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        lv_calendar_date_t date;
        if(lv_calendar_get_pressed_date(obj, &date))
        {
            std::cout<<"选中日期:"<<(int)date.year<<(int)date.month<<(int)date.day<<std::endl;
        }
    }
}

int main(int argc, char **argv)
{
    lv_init();
    hal_init();

    lv_log_register_print_cb(esp32_log_cb);

    lv_obj_t * obj = lv_calendar_create(lv_scr_act());
    static const char *day_names[] =
    {
        "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
    };

    lv_calendar_set_day_names(obj, day_names);

    lv_calendar_set_today_date(obj, 2024, 4, 3);
    lv_calendar_set_showed_date(obj, 2024, 02);

    lv_obj_set_size(obj, 600, 300);
    lv_obj_center(obj);

    static lv_calendar_date_t highlighted_dates[] =
    {
        { .year = 2024, .month = 4, .day = 9 },
        { .year = 2024, .month = 4, .day = 21 },
        { .year = 2024, .month = 4, .day = 26 }
    };

    lv_calendar_set_highlighted_dates(obj, highlighted_dates, 3);

    lv_obj_set_style_text_font(obj,&lv_font_siyuanheiti16,LV_PART_MAIN);

    lv_calendar_header_dropdown_create(obj);
    lv_calendar_set_showed_date(obj, 2024, 04);
    lv_obj_add_event_cb(obj, event_handler3, LV_EVENT_ALL, NULL);


    while (1)
    {
        lv_timer_handler();
        usleep(5 * 1000);
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1565886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强大缓存清理工具 NetShred X for Mac激活版

NetShred X for Mac是一款专为Mac用户设计的强大缓存清理工具&#xff0c;旨在帮助用户轻松管理和优化系统性能。这款软件拥有直观易用的界面&#xff0c;即使是初次使用的用户也能快速上手。 软件下载&#xff1a;NetShred X for Mac激活版下载 NetShred X能够深入扫描Mac系统…

深入理解MySQL:拼接字符串、查询、删除表和创建索引的关键命令

MySQL是一种功能强大的关系型数据库管理系统&#xff0c;广泛应用于各种类型的应用程序中。本文将介绍MySQL中一些常用的关键命令&#xff0c;包括拼接字符串、查询、删除表和创建索引&#xff0c;帮助读者更好地理解和利用MySQL数据库。 mysql拼接字符串 在MySQL中&#xf…

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕&#xff1a;小米Pad6 分辨率&#xff1a;1800X2880 模式&#xff1a;Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

谈谈考研数学几个常见误区

25考研数学&#xff0c;一定一定要吃透基础&#xff0c;练好计算 我之所以要强调这个&#xff0c;是因为现在的考研数学&#xff0c;越来越重视基础和计算的考察&#xff0c;题海战术已经过时&#xff0c;如果想要有效的提升自己&#xff0c;要进行针对性的学习。我去年考研的…

【云呐】固定资产清查盘点报告模板

固定资产清查盘点报告的大致框架:一、前言说明本次清查盘点的背景和目的清晰表述清查盘点的责任与相关依据二、清查盘点范围按部门或区域明确清查范围口径明确被清查项目,如所有原值一定数额以上的固定资产三、清查盘点时间确定清查盘点实施的时间节点 四、清查盘点方法描述清查…

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章&#xff1a;Query Rewriting via Large Language Models&#xff0c;https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展&#xff0c;因为它容易出错并且需要深厚的专业知识。 类似地…

异常-模块-包-Python

师从黑马程序员 异常的概念 异常演示 捕获异常的方法 try:fopen("D:/abc.txt","r",encoding"UTF-8") except:print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开")fopen("D:/a…

继阿里EMO后,腾讯也提出了AniPortrait:用于生成由音频和参考肖像图像驱动的高质量动画

腾讯提出了一种新颖的框架-AniPortrait&#xff0c;用于生成由音频和参考肖像图像驱动的高质量动画。通俗讲&#xff0c;就是给张照片生成说话的视频。类似阿里的EMO&#xff0c;大家先可以简单看下效果。 相关链接 论文&#xff1a;arxiv.org/abs/2403.17694 代码&#xff1a…

【技术访谈】与Babbage项目团队畅谈BSV区块链的新代码库

​​发表时间&#xff1a;2024年3月12日 BSV区块链协会近期宣布上线了JavaScript和TypeScript SDK&#xff0c;后者旨在为开发者提供先进的统一核心代码库&#xff0c;以便利开发者在BSV区块链上开发具备可扩展性的应用程序。 新上线的SDK替代了此前被广泛使用的、但已长期不再…

家用洗地机如何选?四款2024高性能洗地机力荐

家庭清洁是每个家庭都需要面对的日常任务&#xff0c;而一款高效、实用的洗地机能够极大地减轻我们的清洁负担。然而&#xff0c;在众多洗地机品牌和型号中选择一款适合自己的产品并不容易。本文将为您提供一份全面的洗地机选购指南&#xff0c;帮助您了解各种洗地机的特点和功…

el-form表单去除部分校验结果

需求说明 如图&#xff1a; 当点击右边的叉时&#xff0c; 需要删除这个输入框&#xff0c;删除这个输入框只需要一个变量就可以解决。 但使用v-show的方式去除这个输入框的时候&#xff0c;但下面的校验信息却没有消失 解决方法 找了半天&#xff0c;表单局部重置的方法&a…

收下这份地表最强参会指南,4月16日,玩转百度Create大会不迷路

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

windows qt打包保姆级教学

windows qt打包保姆级教学 简述打包打包进阶 简述 在windows下开发的qt程序&#xff0c;想在其他windows计算机上运行&#xff0c;而那个计算机没有qt环境&#xff0c;执行时候会报错各种dll找不到&#xff0c;那么就需要将自己开发的qt程序和用到的库打包。 打包 这里先编译…

Transformer的代码实现 day03(Positional Encoding)

Positional Encoding的理论部分 注意力机制是不含有位置信息&#xff0c;这也就表明&#xff1a;“我爱你”&#xff0c;“你爱我”这两者没有区别&#xff0c;而在现实世界中&#xff0c;这两者有区别。所以位置编码是在进行注意力计算之前&#xff0c;给输入加上一个位置信息…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型&#xff1a;程序计数器…

使用OpenCV4.9的随机生成器和文本

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 4.9基本绘图 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用随机数生…

Java中的可变字符串

Java中的可变字符串 一、什么是可变字符串二、可变字符串的使用场景以及使用步骤1.新建一个可变字符串2.可变字符串的一系列方法 一、什么是可变字符串 可变字符串是Java.lang包下的 在我们学习到JDBC的时候需要将原有的sql语句根据不同的差异添加一段新的关键字或者单词&…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0&#xff0c;代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用&#xff0c;说明被定义的那个变量是指针指针变…

护眼台灯十大排名品牌有哪些?2024护眼台灯十大排名品牌推荐

在当今的教育环境中&#xff0c;学生们面临着相当沉重的学业压力。放学后&#xff0c;许多孩子便投入到无休止的作业之中&#xff0c;常常夜深人静时还未完成。作为家长&#xff0c;孩子的视力健康自然成为了我们心中的一块大石。夜间学习时&#xff0c;灯光的质量至关重要。标…