Linux项目实战——文字系统、UI系统、页面系统(后附百问网课程视频链接)
·
目录
一、文字系统
1. 数据结构抽象
1.字符描述(FontBitMap)

2.字体文件的操作函数(FontOpr)

2. 实现Freetype代码
关键API:
-
FT_Init_FreeType(FT_Library *alibrary)- 用法:用于初始化 FreeType 库。
- 入参:
alibrary是一个指向FT_Library类型的指针,用于存储初始化后的库对象。 - 回参:返回
FT_Error类型的值,表示操作是否成功。成功返回FT_Err_Ok。
-
FT_New_Face(FT_Library library, const char *filepathname, FT_Long face_index, FT_Face *aface)- 用法:加载字体文件并创建一个字体面(face)对象。
- 入参:
library:已初始化的 FreeType 库对象。filepathname:字体文件的路径。face_index:指定要加载的字体面索引,通常为 0 表示默认的字体面。aface:用于存储创建的字体面对象的指针。
- 回参:返回
FT_Error类型的值,指示操作的成功或失败。
-
FT_Set_Pixel_Sizes(FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height)- 用法:设置字体的像素大小。
- 入参:
face:要设置大小的字体面对象。pixel_width:字体的像素宽度。pixel_height:字体的像素高度。
- 回参:返回
FT_Error类型的值,表明操作的结果。
-
FT_Load_Char(FT_Face face, FT_ULong char_code, FT_Int32 load_flags)- 用法:加载特定的字符图像。
- 入参:
face:字体面对象。char_code:要加载的字符的 Unicode 码点。load_flags:加载标志,例如FT_LOAD_DEFAULT等。
- 回参:返回
FT_Error类型的值,指示加载是否成功。
-
FT_Set_Transform(FT_Face face, const FT_Matrix *matrix, const FT_Vector *delta)- 用法:用于设置字体面的变换矩阵和位移向量。
- 入参:
face:要应用变换的字体面对象。matrix:一个FT_Matrix结构,定义了缩放、旋转等变换操作。- 例如:
{.xx = 1.0,.xy = 0.0,.yx = 0.0,.yy = 1.0}表示无缩放和旋转。
- 例如:
delta:一个FT_Vector结构,定义了位移量。
- 回参:返回
FT_Error类型的值,表示操作是否成功。成功时返回FT_Err_Ok。
关键结构体:
-
FT_Library -
FT_Face
-
FT_GlyphSlot
3. 文字管理
参照下图实现font_manager.c,为上层提供更简单的接口函数:

这是个函数的实现就是根据上层的选择的文字操作方式,去调用底层的函数。
4. 单元测试
主要是实现了一个DrawFontBitMap()函数,通过PFontBitMap结构体中的数据绘制位图。
可以参考应用开发,使用freetype显示一行文字的示例代码。
5.错误记录

排查了很久,发现错误在freetype.c中的获取位图函数中
由于给下一个字符的原点赋值错误所导致的。
错误:

正确:

二、UI系统
1. 数据结构抽象
1. 按钮的名字
2. 按钮的区域
3.按钮的绘制
4.按钮的事件
typedef struct Button {
char *name;
int status;
Region tRegion;
int (*OnDraw)(struct Button *ptButton);
int (*OnPressed)(struct Button *ptButton,PDispBuff ptDispBuff,PInputEvent ptInputEvent);
}Button, *PButton;
2.按键编程
对按键进行初始化,实现抽象出来的结构体。
2.1 实现OnDraw()
需要先实现:
1. 绘制底色
void DrawRegion(PRegion ptRegion, unsigned int dwcolor)
2. 居中绘制文字
void DrawTextInButtonCenter(char *name, PRegion ptRegion, unsigned int dwColor)
①确定每一个字符的大小
② 确定第一个字符的起点

然后就可以将绘制出来的按钮刷到LCD上。
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff)
2.2 实现OnPressed()
通过标志位status判断按键当前的状态,从而选颜色的显示。
三、页面系统
1. 数据结构抽象
typedef struct PageAction {
char *name;
void (*Run)(void *pParams);
struct PageAction *ptNext;
}PageAction,*PPageAction;
2. 页面管理器
页面管理器用来管理页面,只需要实现2个函数:
1.PageRegister:把多个页面注册进链表
2.Page(name):取出某个页面
课程链接:
更多推荐
https://www.bilibili.com/video/BV1it4y1Q75z?p=16&vd_source=3a9afee9fda50350a1c881b4325e007d
所有评论(0)