【第3版emWin教程】第27章 emWin6.x支持的字体简介
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429
第27章 emWin6.x支持的字体简介
本章节为大家讲解emWin的另一个重要功能,即emWin所支持的字体。本章节只是一个简介,后面会有几个章节为大家全面讲解emWin的字体显示方案,特别是汉字显示。
本章节的知识点整理自emWin官方手册。
27.1 初学者重要提示
27.2 字体简介
27.3 STemWin支持的字体类型
27.4 字符集
27.5 标志字体
27.6 总结
27.1 初学者重要提示
- emWin官方提供的字体生成软件FontCvt不支持GB编码,所以只能使用FontCvt支持的Unicode编码。
- 本章节说的位图字体就是我们通常所说的点阵字体。
- 字体显示的所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数的位置
下图是英文版手册里面API函数的位置:
27.2 字体简介
emWin库默认支持的字体全部是以C文件形式存在的,所有文件均包含有ASCII字符集,大部分还包含ISO 8859-1字符集。对于这两种字符集来说,使用8bit就可以表示,即256种字符,其中前32种字符是控制字符。下面是低版本的uCGUI3.98源码中带的字体文件部分截图:
由于仅仅是ASCII和ISO 8859-1字符集,并不怎么占空间,以C文件形式存在是比较合理的。此时就有一个问题摆在初学者面前,只有ASCII和ISO 8859-1字符集,那么显示汉字怎么办?这个问题就是后续章节要给大家讲解的。
同时, STemWin字体包含抗锯齿、复合字符的图样 (比如泰语中的要求)、位于外部存储器字体(主要是指XBF字体和SIF字体,)以及 TrueType 矢量字体支持。除 TrueType矢量字体格式外,所有其他字体均为位图字体,或者说点阵字体。
27.3 emWin支持的字体类型
这里我们通过官方的字体转换器来了解一下emWin支持的字体类型,首先需要大家下载这个小软件:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=107218 ,打开后的界面效果如下:
从上面截图可以看出该软件主要支持7种字体类型,下面说一下这7种都代表什么意思。解释时都以微软雅黑字体中的“啊”字来说明,字体大小选择18。
27.3.1 Standard 比例位图字体
比例位图字体的每个字符高度相同、宽度可能不同。像素信息保存为1 bpp(bit per pixel),涵盖整个字符区域。“啊”字显示效果如下:
27.3.2 Antialiased 2bpp 抗锯齿字体
每个字符高度相同、宽度可能不同。像素信息保存为2bpp抗锯齿信息,涵盖整个字符区域。“啊”字显示效果如下:
27.3.3 Antialiased 4bpp 抗锯齿字体
每个字符高度相同、宽度可能不同。像素信息保存为4 bpp抗锯齿信息,涵盖整个字符区域。“啊”字显示效果如下:
27.3.4 Extended 扩展比例位图字体
扩展比例位图字体的每个字符拥有自己的高度和宽度。像素信息保存为1 bpp,仅涵盖字形位图区域。注意和前面的Standard字体的区别。
27.3.5 Extended 2bpp扩展比例位图字体
每个字符高度相同、宽度可能不同。像素信息保存为2 bpp抗锯齿信息,仅涵盖字形位图区域。注意和前面的Antialiased 2bpp字体的区别。
27.3.6 Extended 4bpp扩展比例位图字体
每个字符高度相同、宽度可能不同。像素信息保存为4bpp抗锯齿信息,仅涵盖字形位图区域。注意和前面的Antialiased 4bpp字体的区别。
27.3.7 Extended framed带边框的扩展比例位图字体
在某些情况下 (例如编译时背景颜色未知),可以使用带边框的字体。带边框的字体始终在透明模式
下绘制,与当前设置无关。字符像素按当前所选的前景颜色绘制,边框按背景颜色绘制。前景颜色和背景颜色之间明显的对比可以确保能够阅读文本,而与背景无关。请注意,这种类型的字体不适用于复合字符,例如泰语。另外,也不适用于Arabic字体。
27.3.8 等宽位图字体
字体转换软件FontCvt不支持这种字体的生成。等宽位图字体的每个字符大小相同。以下屏幕截图概述了所有可用的等宽字体:
27.3.9 TrueType 矢量字体
TrueType是Apple Computer开发的轮廓字体标准。它为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType字体基于矢量图形。矢量表示的优势在于无损的可扩展性。
27.4 字符集
字符集方面的知识请看第27章节,这里的字符集知识是来自emWin手册,所以也整理出来了,但是比较简单。
27.4.1 ASCII字符集
emWin支持完整的ASCII字符集。以下是从32到127的96种字符:
由于ASCII代表美国信息交换标准代码,所以它是针对美国需求而设计。它不包含欧洲语言中使用的任何特殊字符,例如Ä, Ö, Ü, á, à,以及其他字符。这些“欧洲扩展”的ASCII字符集没有唯一的标准,而是存在多个不同的标准。互联网以及大多数Windows程序使用的标准是ISO8859-1,即ASCII字符集的超集。
27.4.2 ISO 8859-1西方拉丁字符集
ISO 8859-1正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号。
下面是emWin手册给出的扩展字符(从160到255,共96个,这里仅贴出了160到180,全部内容请看emWin手册)。
wiki百科中也解释了ISO 8859-1字符集且给出了一个完整的字符表,贴到本章节很合适:https://zh.wikipedia.org/wiki/ISO/IEC_8859-1
在上表中,0x20是空格、0xA0是不换行空格、0xAD是选择性连接号。0x00-0x1F、0x7F、0x80-0x9F在此字符集中未有定义(控制字符是由ISO/IEC 6429定义)。
27.4.3 Unicode
Unicode是最终的字符解码方法。它是基于ASCII和ISO 8859-1国际标准。与ASCII不同的是,UNICODE要求16位字符,因为所有字符都拥有自己的代码。当前,定义了30,000多种不同的字符。不过,并非所有字符图像在emWin中都进行了定义。用户可自行定义其他相关字符。
Unicode标准是一种16位字符编码方案。全世界所有可用字符都包含在一个16位的字符集中 (全球统一)。Unicode标准由统一码联盟(Unicode Consortium)定义。emWin能显示采用Unicode编码的单个字符或字符串,不过,最常见的情况是使用混合字符串,即一个ASCII字符串中有任意个Unicode序列。
27.5 标准字体
标准字体包含不同大小,不同样式的等宽字体和比例字体。等宽字体指字符宽度固定的字体,其中所有字符的宽度像素相同。比例字体指其中每个字符有自己单独的宽度像素的字体。
关于字体标识符命名规则,字体文件命名约规则,字体信息、占用flash大小和字符集已经在emWin手册里面有详细的说明,这里就不再啰嗦了,重点是跟大家演示一下效果。
27.5.1 比例字体
emWin所支持的比例字体以及显示效果如下:
下面是在emWin模拟器上运行的程序(运行方法已经在前面第9章和第10章有讲解):
#include "GUI.h" /********************************************************************* * * MainTask */ void MainTask(void) { /* emWin初始化 */ GUI_Init(); /* 设置不同的字体显示字符 */ GUI_SetFont(&GUI_Font8_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 0); GUI_SetFont(&GUI_Font10S_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 30); GUI_SetFont(&GUI_Font13_1); GUI_DispStringAt("Hello world! www.armfly.com", 0, 60); GUI_SetFont(&GUI_Font16_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 90); GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 120); GUI_SetFont(&GUI_FontComic24B_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 150); GUI_SetFont(&GUI_Font32B_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 180); while (1) { GUI_Delay(10); } }
模拟器显示效果如下:
27.5.2 比例字体,带边框
emWin库本身所带的字体库中只有GUI_Font20F_ASCII支持边框显示。显示效果如下:
下面是在emWin模拟器上运行的程序(运行方法已经在前面第9章和第10章有讲解):
#include "GUI.h" /********************************************************************* * * MainTask */ void MainTask(void) { /* emWin初始化 */ GUI_Init(); /* 设置字体显示字符 */ GUI_SetFont(&GUI_Font20F_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 0); while (1) { GUI_Delay(10); } }
实际显示效果如下(显示中没有边框,原因待查),
27.5.3 等宽字体
关于等宽字体已经在前面27.3.8小节跟大家进行了简单说明,下面是在emWin模拟器上运行的程序(运行方法已经在前面第9章和第10章有讲解):
#include "GUI.h" /********************************************************************* * * MainTask */ void MainTask(void) { /* emWin初始化 */ GUI_Init(); /* 设置不同的字体显示字符 */ GUI_SetFont(&GUI_Font6x8_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 0); GUI_SetFont(&GUI_Font8x8_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 30); GUI_SetFont(&GUI_Font8x10_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 60); GUI_SetFont(&GUI_Font8x13_ASCII); GUI_DispStringAt("Hello world! www.armfly.com", 0, 90); GUI_SetFont(&GUI_Font8x16x1x2); GUI_DispStringAt("Hello world! www.armfly.com", 0, 120); GUI_SetFont(&GUI_Font8x16x2x2); GUI_DispStringAt("Hello world! www.armfly.com", 0, 150); GUI_SetFont(&GUI_Font8x16x3x3); GUI_DispStringAt("Hello world! www.armfly.com", 0, 180); while (1) { GUI_Delay(10); } }
实际显示效果如下:
27.5.4 数字字体(比例)
emWin支持的数字字体主要有以下四种:
下面是emWin模拟器上运行的程序(仅支持数字显示,字符是无法显示的,切记,另外运行方法已经在前面第9章和第10章有讲解):
#include "GUI.h" /********************************************************************* * * MainTask */ void MainTask(void) { /* emWin初始化 */ GUI_Init(); /* 设置不同的字体显示字符 */ GUI_SetFont(&GUI_FontD32); GUI_DispStringAt("0123456789", 0, 0); GUI_SetFont(&GUI_FontD48); GUI_DispStringAt("0123456789", 0, 32); GUI_SetFont(&GUI_FontD64); GUI_DispStringAt("0123456789", 0, 32+48); GUI_SetFont(&GUI_FontD80); GUI_DispStringAt("0123456789", 0, 32+48+64); while (1) { GUI_Delay(10); } }
实际显示效果如下:
27.5.5 数字字体(等宽)
emWin支持的等宽数字字体主要有以下四种:
下面是emWin模拟器上运行的程序(仅支持数字显示,字符是无法显示的,切记,另外运行方法已经在前面第9章和第10章有讲解):
#include "GUI.h" /********************************************************************* * * MainTask */ void MainTask(void) { /* emWin初始化 */ GUI_Init(); /* 设置不同的字体显示字符 */ GUI_SetFont(&GUI_FontD24x32); GUI_DispStringAt("0123456789", 0, 0); GUI_SetFont(&GUI_FontD36x48); GUI_DispStringAt("0123456789", 0, 32); GUI_SetFont(&GUI_FontD48x64); GUI_DispStringAt("0123456789", 0, 32+48); GUI_SetFont(&GUI_FontD60x80); GUI_DispStringAt("0123456789", 0, 32+48+64); while (1) { GUI_Delay(10); } }
实际显示效果如下:
27.6 总结
本期教程主要是跟大家介绍一下emWin支持的字体类型并重点介绍标准字体的使用方法,望初学者务必掌握。