转stemwin教程
STemWin对字体的支持还是非常全面的,包含抗锯齿、复合字符的图样 (例如泰语中的要求)、位于外部非可寻址介质中的字体以及TrueType支持。除TrueType字体 (矢量字体)格式外,所有其他字体均为位图字体。本期教程主要给大家全面的讲解一下STemWin支持的字体,SIF(系统独立字体),TTE(矢量字体)和XBF(外置字体)方式字体的实现会在后面及其教程中跟大家再做详细的介绍。本期教程的重点是STemWin本身所带的标准字体。
16. 1 字体类型
16. 2 字符集
16. 3 标准字体
16. 4 总结
16.1 字体类型
这里我们通过官方的字体转换器来了解一下emWin支持的字体类型,字体转换器和前面讲GUIBulder5.22在同一个文件目录里面。打开后界面如下:
1
|
|
|
|
从软件上面看主要支持7中字体的转换,下面说一下这7中都代表什么意思。解释时我们都以微软雅黑字体中的‘啊’字来说明,字体大小选择18
|
|
|
|
|
16.1.1 Standard比例位图字体
比例位图字体的每个字符高度相同、宽度可能不同。像素信息保存为1 bpp,涵盖整个字符区域。
‘啊’字显示效果如下:
|
|
|
|
|
16.1.2 Antialiased2bpp 抗锯齿字体
每个字符高度相同、宽度可能不同。像素信息保存为2 bpp抗锯齿信息,涵盖整个字符区域。‘啊’字显示效果如下:
|
|
|
|
|
16.1.3 Antialiased4bpp 抗锯齿字体
每个字符高度相同、宽度可能不同。像素信息保存为4 bpp抗锯齿信息,涵盖整个字符区域。‘啊’字显示效果如下:
|
|
|
|
|
16.1.4 Extended扩展比例位图字体
扩展比例位图字体的每个字符拥有自己的高度和宽度。像素信息保存为1 bpp,仅涵盖字形位图区域。注意和前面的Standard字体的区别。
|
|
|
|
|
16.1.5 Extended2bpp扩展比例位图字体
每个字符高度相同、宽度可能不同。像素信息保存为2 bpp抗锯齿信息,仅涵盖字形位图区域。注意和前面的Antialiased 2bpp字体的区别。
|
|
|
|
|
16.1.6 Extended4bpp扩展比例位图字体
每个字符高度相同、宽度可能不同。像素信息保存为4bpp抗锯齿信息,仅涵盖字形位图区域。注意和前面的Antialiased 4bpp字体的区别。
|
|
|
|
|
16.1.7 Extendedframed带边框的扩展比例位图字体
在某些情况下 (例如编译时背景颜色未知),可以使用带边框的字体。带边框的字体始终在透明模式下绘制,与当前设置无关。字符像素按当前所选的前景颜色绘制,边框按背景颜色绘制。前景颜色和背景颜色之间明显的对比可以确保能够阅读文本,而与背景无关。请注意,这种类型的字体不适用于复合字符,例如泰语。另外,也不适用于Arabic字体。16.1.8 等宽位图字体
上面的字体转换器不支持这种字体。等宽位图字体的每个字符大小相同。以下屏幕截图概述了所有可用的等宽字体:
|
|
|
|
|
16.1.7 Extendedframed带边框的扩展比例位图字体
在某些情况下 (例如编译时背景颜色未知),可以使用带边框的字体。带边框的字体始终在透明模式下绘制,与当前设置无关。字符像素按当前所选的前景颜色绘制,边框按背景颜色绘制。前景颜色和背景颜色之间明显的对比可以确保能够阅读文本,而与背景无关。请注意,这种类型的字体不适用于复合字符,例如泰语。另外,也不适用于Arabic字体。16.1.8 等宽位图字体
上面的字体转换器不支持这种字体。等宽位图字体的每个字符大小相同。以下屏幕截图概述了所有可用的等宽字体:
|
|
|
|
|
16.1.9 TrueType矢量字体
在教程的后面会专门抽出一章跟大家讲解矢量字体。TrueType是Apple Computer开发的轮廓字体标准。它为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType字体基于矢量图形。矢量表示的优势在于无损的可扩展性。
|
|
|
|
|
16.2 字符集
16.2.1 ASCII
emWin支持完整的ASCII字符集。以下是从32到127的96种字符:
由于ASCII代表美国信息交换标准代码,所以它是针对美国需求而设计。它不包含欧洲语言中使用的任何特殊字符,例如Ä, Ö, ü, á, à,以及其他字符。这些“欧洲扩展”的ASCII字符集没有唯一的标准,而是存在多个不同的标准。互联网以及大多数Windows程序使用的标准是ISO8859-1,即ASCII字符集的超集。
|
|
|
|
|
16.2.2 ISO8859-1西方拉丁字符集
STemWin支持ISO 8859-1。ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
HTML 4.01 支持 ISO 8859-1 (Latin-1) 字符集。
ISO-8859-1 的较低部分(从 1 到127 之间的代码)是最初的 7 比特 ASCII。
ISO-8859-1 的较高部分(从 160 到255 之间的代码)全都有实体名称。
这些符号中的大多数都可以在不进行实体引用的情况下使用,但是实体名称或实体编号为那些不容易通过键盘键入的符号提供了表达的方法。
下面是emWin支持的字符(从216到255,从160到215的没有贴,详细看emWin手册)
|
|
|
|
|
16.2.3 Unicode
Unicode是最终的字符解码方法。它是基于ASCII和ISO 8859-1国际标准。与ASCII不同的是,UNICODE要求16位字符,因为所有字符都拥有自己的代码。当前,定义了30,000多种不同的字符。不过,并非所有字符图像在emWin中都进行了定义。用户可自行定义其他相关字符。
Unicode标准是一种16位字符编码方案。全世界所有可用字符都包含在一个16位的字符集中 (全球统一)。Unicode标准由统一码联盟(UnicodeConsortium)定义。emWin能显示采用Unicode编码的单个字符或字符串,不过,最常见的情况是使用混合字符串,即一个ASCII字符串中有任意个Unicode序列。
|
|
|
|
|
16.3 标准字体
STemWin随附一系列字体,可满足大部分需求。标准字体包包含不同大小和样式的等宽字体和比例字体。等宽字体指字符宽度固定的字体,其中所有字符的宽度像素相同。比例字体指其中每个字符有自己单独的宽度像素的字体(这个在前面的16.1小节已经有详细的讲解)。
关于字体标识符命名约定,字体文件命名约定和字体的计量、ROM大小和字符集已经在emWin手册里面有详细的说明,这里就不再啰嗦了。重点是跟大家演示一下效果。
16.3.1 比例字体
STemWin所支持的比例字体以及显示效果如下:
|
|
|
|
|
下面在emWin模拟器上面跟大家演示一下显示效果,模拟器上运行的程序如下:
复制代码
#include "GUI.h"
void MainTask(void)
{
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);
}
|
|
|
|
|
16.3.2 比例字体,带边框
STemWin库本身所带的字体库中只有GUI_Font20F_ASCII支持边框显示。显示效果如下:
|
|
|
|
|
下面在emWin模拟器上面跟大家演示一下显示效果,模拟器上运行的程序如下:
复制代码
#include "GUI.h"
void MainTask(void)
{
GUI_Init();
GUI_SetFont(&GUI_Font20F_ASCII);
GUI_DispStringAt("Hello world! www.armfly.com", 0, 0);
while(1);
}
|
|
|
|
|
实际显示效果如下,不知道为什么没有边框的效果
不知道为什么没有边框的效果,有兴趣的可以尝试在开发板上面做个试验,应该是有边框效果的。
|
|
|
|
|