📄 17. 文字和字体.txt
字号:
case WM_SYSCOLORCHANGE :
InvalidateRect (hwnd, NULL, TRUE) ;
break ;
另一个影响文字的设备内容属性是字符间距。它的默认值是0,表示Windows不在字符之间添加任何空间,但您可以使用以下函数插入空间:
SetTextCharacterExtra (hdc, iExtra) ;
参数iExtra是逻辑单位,Windows将其转换为最接近的图素,它可以是0。如果您将iExtra取为负值(希望将字符紧紧压在一起),Windows会接受这个数值的绝对值─也就是说,您不能使iExtra的值小于0。您可以通过呼叫GetTextCharacterExtra取得目前的字符间距,Windows在传回该值前会将图素间距转换为逻辑单位。
使用备用字体
当您呼叫TextOut、TabbedTextOut、ExtTextOut、DrawText或DrawTextEx书写文字时,Windows使用设备内容中目前选择的字体。字体定义了特定的字样和大小。以不同字体显示文字的最简单方法是使用Windows提供的备用字体,然而,它的范围是很有限的。
您可以呼叫下面的函数取得某种备用字体的句柄:
hFont = GetStockObject (iFont) ;
其中,iFont是几个标识符之一。然后,您就可以将该字体选入设备内容:
SelectObject (hdc, hFont) ;
这些您也可以只用一步完成:
SelectObject (hdc, GetStockObject (iFont)) ;
在内定的设备内容中选择的字体称为系统字体,能够由GetStockObject的SYSTEM_FONT参数识别。这是调和的ANSI字符集字体。在GetStockObject中指定SYSTEM_FIXED_FONT(我在本书的前面几个程序中应用过),可以获得等宽字体的句柄,这一字体与Windows 3.0以前的系统字体兼容。在您希望所有的字体都具有相同宽度时,这是很方便的。
备用字体OEM_FIXED_FONT也称为终端机字体,是Windows在MS-DOS命令提示窗口中使用的字体,它包括与原始IBM-PC扩展字符集兼容的字符集。Windows在窗口标题列、菜单和对话框的文字中使用DEFULT_GUI_FONT。
当您将新字体选入设备内容时,必须使用GetTextMetrics计算字符的高度和平均宽度。如果选择了调和字体,那么一定要注意,字符的平均宽度只是个平均值,某些字符会比它宽或比它窄。在本章的后面,您会了解到确定由不同宽度字符所组成的字符串总宽度的方法。
尽管GetStockObject确实提供了存取不同字体的最简单方式,但是您还不能充分控件Windows所提供的字体。不久,您会看到指定字体字样和大小的方法。
字体的背景
本章剩余的部分致力于处理不同的字体。但是在您接触这些特定程序代码前,对Windows使用字体的基本知识有一个深入的了解是很有好处的。
字体型态
Windows支持两大类字体,即所谓的「GDI字体」和「设备字体」。GDI字体储存在硬盘的文件中,而设备字体是输出设备本来就有的。例如,通常打印机都具有内建的设备字体集。
GDI字体有三种样式:点阵字体,笔划字体和TrueType字体。
点阵字体的每个字符都以位图图素图案的形式储存,每种点阵字体都有特定的纵横比和字符大小。Windows通过简单地复制图素的行或列就可以由GDI点阵字体产生更大的字符。然而,只能以整数倍放大字体,并且不能超过一定的限度。由于这种原因,GDI点阵字体又称为「不可缩放的」字体。它们不能随意地放大或缩小。点阵字体的主要优点是显示性能(显示速度很快)和可读性(因为是手工设计的,所以尽可能清晰)。
字体是通过字体名称识别的,点阵字体的字体名称为:
System (用于SYSTEM_FONT)
FixedSys (用于SYSTEM_FIXED_FONT)
Terminal (用于OEM_FIXED_FONT)
Courier
MS Serif
MS Sans Serif(用于DEFAULT_GUI_FONT)
Small Fonts
每个点阵字体只有几种大小(不超过6种)。Courier字体是定宽字体,外形与用打字机打出的字体相似。「Serif」指字体字母笔划在结束时拐个小弯。「sans serif」字体不是serif类的字体。在Windows的早期版本中,MS(Microsoft)Serif和MS Sans Serif字体被称为Tms Rmn(指它与Times Roman相似)和Helv(与Helvetica相似)。Small Fonts是专为显示小字设计的。
在Windows3.1以前,除了GDI字体外,Windows所提供的字体只有笔划字体。笔划字体是以「连结点」的方式定义的一系列线段,笔划字体可以连续地缩放,这意味着同样的字体可以用于具有任何分辨率的图形输出设备,并且字体可以放大或缩小到任意尺寸。不过,它的性能不好,小字体的可读性也很糟,而大字体由于笔划是单根直线而显得很单薄。笔划字体有时也称为绘图机字体,因为它们特别适合于绘图机,但是不适合于别的场合。笔划字体的字样有:Modern、Roman和Script。
对于GDI点阵字体和GDI笔划字体,Windows都可以「合成」粗体、斜体、加底线和加删除线,而不需要为每种属性另外储存字体。例如,对于斜体,Windows只需要将字符的上部向右移动就可以了。
接下来是Truetype,我将在本章的剩部分主要讨论它。
TrueType 字体
TrueType字体的单个字符是通过填充的直线和曲线的轮廓来定义的。Windows可以通过改变定义轮廓的坐标对TrueType字体进行缩放。
当程序开始使用特定大小的TrueType字体时,Windows「点阵化」字体。这就是说Windows使用TrueType字体文件中包括的「提示」对每个字符的连结直线和曲线的坐标进行缩放。这些提示可以补偿误差,避免合成的字符变得很难看(例如,在某些字体中,大写H的两竖应该一样宽,但盲目地缩放字体可能会导致其中一竖的图素比另一竖宽。有了提示就可以避免这些现象发生)。然后,每个字符的合成轮廓用于建立字符的位图,这些位图储存在内存以备将来使用。
最初,Windows使用了13种TrueType字体,它们的字体名称如下:
Courier New
Courier New Bold
Courier New Italic
Courier New Bold Italic
Times New Roman
Times New Roman Bold
Times New Roman Italic
Times New Roman Bold Italic
Arial
Arial Bold
Arial Italic
Arial Bold Italic
Symbol
在新的Windows版本中,这个列表更长了。在此特别指出,我将使用Lucida Sans Unicode字体,它包括了一些在世界其它地方使用的字母表。
三个主要字体系列与点阵字体相似,Courier New是定宽字体。它看起来就像是打字机输出的字体。Times New Roman是Times字体的复制品,该字体最初为《Times of London》设计,并用在许多印刷材料上,它具有很好的可读性。Arial是Helvetica字体的复制品,是一种sans serif字体。Symbol字体包含了手写符号集。
属性或样式
在上面的TrueType字体列表中,您会注意到,Courier、Times New Roman和Arial的粗体和斜体是带有自己字体名称的单独字体,这一命名与传统的板式一致。然而,计算机使用者认为粗体和斜体只是已有字体的特殊「属性」。Windows在定义点阵字体命名、列举和选择的方式时,采用了属性的方法。但对于TrueType字体,更倾向于使用传统的命名方式。
这种冲突在Windows中还没有完全解决,简而言之,您可以完全通过命名或特定属性来选择字体。然而在处理字体列举时,应用程序需要系统中的字体列表,正如您所预料,这种双重处理使问题复杂化了。
点值
在传统的版式中,您可以用字体名称和大小来指定字体,字体的大小以点的单位来表示。一点与1/72英…己芙咏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -