显示中文
LVGL内置有一个中文字库 CJK字库,这个字库在 i_conth中定义为:LV_FONT_SIMSUN_16_CIK。要在Ivgl中使用显示自己的中文字库,我们需要用到两个东西:字体文件和字体转换器字体文件我们可以使用开源的字体或者自己制作出来,准备好了字体文件之后使用字体转换器即可转换成可以在lgl上使用的字体格式。开源字体获取页面:
准备好字体文件之后就可以通过lvgl官方提供的字体转换器,提取转换你想要的字体,LVGI官方在线字体转换器页面:
如何在 LVGL 中使用生成的字体?
1.将结果文件复制到你的LVGL项目中,并包含到项目
2.在你的项目应用程序的C文件中,将字体声明为:
extern lv font t my font name:
或
LV FONT DECLARE(my font_name):
3.在样式中设置字体:
Iv_style_set_text_font(&style obi, &my font name);// 普通(共享)样式
Iv_obi_set_style_text_font(label, &my_font_name. 0);// 私有(本地)样式
根据上面的照片。当函数退出之后栈空间就被回收了。为什么char*text保存在栈空间,Iv_label_set_text_static 能将文本显示出来呢?
答:lv_label_set_text() vs lv_label_set_text_static()
- lv_label_set_text() 函数接受一个指向字符串的指针作为参数,并将其复制到内部缓冲区中。这意味着当你调用此函数时,必须保证指针所指向的内存区域在整个生命周期内有效。如果指针指向的内存区域在函数返回后被释放,那么标签上的文本可能会出现问题。
- lv_label_set_text_static() 函数则不同,它不复制字符串,而是直接存储了指针。这样做的好处是可以节省内存,因为不需要额外的拷贝操作。但是,这也意味着指针必须始终有效,即使在函数返回之后也是如此。
由于常量字符串存在于程序的只读数据段,它们在整个程序执行期间都保持不变。因此,即使函数退出,lv_label_set_text_static() 也能继续引用这个字符串,从而在屏幕上显示出来。这是因为在C语言中,常量字符串的生命周期贯穿整个程序的运行过程,直到程序结束才会被销毁。
总结来说,lv_label_set_text_static() 不会复制字符串,而是保存了指向字符串的指针。只要这个指针指向的字符串在整个程序执行过程中一直有效,lv_label_set_text_static() 就能正常工作。在这个例子中,由于字符串是在 .rodata 段中,所以即使函数退出,指针仍然有效,因此标签上的文本仍然可见。
本文基于韦东山老师的视频进行学习的笔记,如有侵权请联系。