Linux项目实战——文字系统、UI系统、页面系统(后附百问网课程视频链接)

目录

一、文字系统

1. 数据结构抽象 

2. 实现Freetype代码 

3. 文字管理 

4. 单元测试

5.错误记录

二、UI系统

1. 数据结构抽象

2.按键编程

        2.1 实现OnDraw()

        2.2  实现OnPressed()

三、页面系统

 1. 数据结构抽象

 2. 页面管理器

课程链接:


一、文字系统

1. 数据结构抽象 

        1.字符描述(FontBitMap)

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

2. 实现Freetype代码 

        关键API:

  1. FT_Init_FreeType(FT_Library *alibrary)
    • 用法:用于初始化 FreeType 库。
    • 入参:alibrary 是一个指向 FT_Library 类型的指针,用于存储初始化后的库对象。
    • 回参:返回 FT_Error 类型的值,表示操作是否成功。成功返回 FT_Err_Ok 。
  2. 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 类型的值,指示操作的成功或失败。
  3. FT_Set_Pixel_Sizes(FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height)
    • 用法:设置字体的像素大小。
    • 入参:
      • face:要设置大小的字体面对象。
      • pixel_width:字体的像素宽度。
      • pixel_height:字体的像素高度。
    • 回参:返回 FT_Error 类型的值,表明操作的结果。
  4. 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 类型的值,指示加载是否成功。
  5. 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):取出某个页面

课程链接:

4-2_文字系统_实现Freetype代码_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1it4y1Q75z?p=16&vd_source=3a9afee9fda50350a1c881b4325e007d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值