WINDOWS程式设计--文字和字体

来源:互联网 发布:ug编程基础 编辑:程序博客网 时间:2024/04/27 17:03

显示文字是本书所要解决的首要问题,现在我们来研究Microsoft Windows中各种有效字体字体大小的使用方法以及调整文字的方式。

Windows 3.1发表的TrueType使程式写作者和使用者以灵活的方式处理文字的能力大幅增强。TrueType是轮廓字体技术,由Apple Computer公司和Microsoft公司开发,并被许多字体制造商支援。由於TrueType字体能够连续缩放,并能应用於视讯显示器和印表机,现在能够在Windows下实作真的WYSIWYG(whatyou see is what you get:所见即所得)。TrueType也便於制作「奇妙」字体,例如旋转的字母、内部填充图案的字母或将它们用於剪裁区域,在本章我将展示它们。

简单的文字输出

让我们先来看看Windows文字输出、影响文字的装置内容属性以及备用字体提供的各种函式。

文字输出函式

我已经在许多范例程式中使用过最常用的文字输出函式:

<span style="font-size:18px;">TextOut (hdc, xStart, yStart, pString, iCount) ; </span>

参数xStart和yStart是逻辑座标上字串的起始点。通常,这是Windows开始绘制的第一个字母的左上角。TextOut需要指向字串的指标和字串的长度,这个函式不能识别以NULL终止的字串。

TextOut函式的xStart和yStart参数的含义可由SetTextAlign函式改变。TA_LEFT、TA_RIGHT和TA_CENTER旗标影响使用xStart在水平方向上定位字串的方式。预设值是TA_LEFT。如果在SetTextAlign函式中指定了TA_RIGHT,则後面的TextOut呼叫会将字串的最後一个字元定位於xStart,如果指定了TA_CENTER,则字串的中心位於xStart。

类似地,TA_TOP、TA_BOTTOM和TA_BASELINE旗标影响字串的垂直位置。TA_TOP是预设值,它意味著字串的字母顶端位於yStart,使用TA_BOTTOM意味著字串位於yStart之上。可以使用TA_BASELINE定位字串,使基准线位於yStart。基准线是如小写字母p、q、y等字母下部的线。

如果您使用TA_UPDATECP旗标呼叫SetTextAlign,Windows就会忽略TextOut的xStart和yStart参数,而使用由MoveToEx、LineTo或更改目前位置的另一个函式设定的位置。TA_UPDATECP旗标也使TextOut函式将目前位置更新为字串的结尾(TA_LEFT)或字串的开头(TA_RIGHT)。这在使用多个TextOut呼叫显示一行文字时非常有用。当水平位置是TA_CENTER时,在TextOut呼叫後,目前位置不变。

您应该还记得,第四章的一系列SYSMETS程式显示几列文字时,对每一列都需要呼叫一个TextOut,其替代函式是TabbedTextOut函式:

<span style="font-size:18px;">TabbedTextOut ( hdc, xStart, yStart, pString, iCount,iNumTabs, piTabStops, xTabOrigin) ;</span>

如果文字字串中含有嵌入的跳位字元(‘/t’或0x09),则TabbedTextOut会根据传递给它的整数阵列将跳位字元扩展为空格。

TabbedTextOut的前五个参数与TextOut相同,第六个参数是跳位间隔数,第七个是以图素为单位的跳位间隔阵列。例如,如果平均字元宽度是8个图素,而您希望每5个字元加一个跳位间隔,则这个阵列将包含40、80、120,按递增顺序依此类推。

如果第六个和第七个参数是0或NULL,则跳位间隔按每八个平均字元宽度设定。如果第六个参数是1,则第七个参数指向一个整数,表示跳位间隔重复增大的倍数(例如,如果第六个参数是1,并且第七个参数指向值为30的变数,则跳位间隔设定在30、60、90…图素处)。最後一个参数给出了从跳位间隔开始测量的逻辑x座标,它与字串的起始位置可能相同也可能不同。

另一个进阶的文字输出函式是ExtTextOut(字首Ext表示它是扩展的):

<span style="font-size:18px;">ExtTextOut (hdc, xStart, yStart, iOptions, &rect,pString, iCount, pxDistance);</span>

第五个参数是指向矩形结构的指标,在iOptions设定为ETO_CLIPPED时,该结构为剪裁矩形,在iOptions设定为ETO_OPAQUE时,该结构为用目前背景色填充的背景矩形。这两种选择您可以都采用,也可以都不采用。

最後一个参数是整数阵列,它指定了字串中连续字元的间隔。程式可以使用它使字元间距变窄或变宽,因为有时需要在较窄的列中调整单个文字。该参数可以设定为NULL来使用内定的字元间距。

用於写文字的高级函式是DrawText,我们第一次遇到它是在第三章讨论HELLOWIN程式时,它不指定座标的起始位置,而是通过RECT结构型态定义希望显示文字的区域:

<span style="font-size:18px;">DrawText (hdc, pString, iCount, &rect, iFormat); </span>

和其他文字输出函式一样,DrawText需要指向字串的指标和字串的长度。然而,如果在DrawText中使用以NULL结尾的字串,就可以将iCount设定为-1,Windows会自动计算字串的长度。

当iFormat设定为0时,Windows会将文字解释为一系列由carriage return字元(‘/r’或0x0D)或linefeed字元(‘/n’或0x0A)分隔的行。文字从矩形的左上角开始,carriage return字元或linefeed字元被解释为换行字元,因此Windows会结束目前行而开始新的一行。新的一行从矩形的左侧开始,在上一行的下面空开一个字元的高度(没有外部间隔)。包含字母的任何文字都应该显示在所剪裁矩形底部的右边或下边。

您可以使用iFormat参数更改DrawText的内定操作,iFormat由一个或多个旗标组成。DT_LEFT旗标(预设值)指定了左对齐的行,DT_RIGHT指定了向右对齐的行,而DT_CENTER指定了位於矩形左边和右边中间的行。因为DT_LEFT的值是0,所以如果只需要左对齐,就不需要包含识别字。

如果您不希望将carriage return字元或linefeed字元解释为换行字元,则可以包括识别字DT_SINGLELINE。然後,Windows会把carriage return字元和linefeed字元解释为可显示的字元,而不是控制字元。在使用DT_SINGLELINE时,还可以将行指定为位於矩形的顶端(DT_TOP)、底端(DT_BOTTOM)或者中间(DT_VCETER,V表示垂直)。

在显示多行文字时,Windows通常只在carriage return字元或linefeed字元处换行。然而,如果行的长度超出了矩形的宽度,则可以使用DT_WORDBREAK旗标,它使Windows在行内字的末尾换行。对於单行或多行文字的显示,Windows会把超出矩形的文字部分截去,可以使用DT_NOCLIP跳过这个操作,这个旗标还加快了函式的速度。当Windows确定多行文字的行距时,它通常使用不带外部间距的字元高度,如果您想在行距中加入外部间距,就可以使用旗标DT_EXTERNALLEADING。

如果文字中包含跳位字元(‘/t’或0x09),则您需要包括旗标DT_EXPANDTABS。在内定情况下,跳位间隔设定於每八个字元的位置。通过使用旗标DT_TABSTOP,您可以指定不同的跳位间隔,在这种情况下,iFormat的高位元组包含了每个新跳位间隔的字元位置数值。不过我建议您避免使用DT_TABSTOP,因为iFormat的高位元组也用於其他旗标。

DT_TABSTOP旗标存在的问题,可以由新的函式DrawTextEx来解决,它含有一个额外的参数:

<span style="font-size:18px;">DrawTextEx (hdc, pString, iCount, &rect, iFormat, &drawtextparams);</span>

最後一个参数是指向DRAWTEXTPARAMS结构的指标,它的定义如下:

<span style="font-size:18px;">1.typedef struct tagDRAWTEXTPARAMS  2.{  3.    UINT    cbSize ;                    // size of structure  4.        int     iTabLength ;            // size of each tab stop  5.        int     iLeftMargin ;           // left margin  6.        int     iRightMargin ;          // right margin  7.        UINT    uiLengthDrawn ;         // receives number of characters processed  8.} DRAWTEXTPARAMS, * LPDRAWTEXTPARAMS ; </span>

中间的三个栏位是以平均字元的增量为单位的。

文字的装置内容属性

除了上面讨论的SerTextAlign外,其他几个装置内容属性也对文字产生了影响。在内定的装置内容下,文字颜色是黑色,但您可以用下面的叙述进行更改:

<span style="font-size:18px;">1.SetTextColor (hdc, rgbColor) ;  </span>

使用画笔的颜色和画刷的颜色,Windows把rgbColor的值转换为纯色,您可以通过呼叫GetTextColor取得目前文字的颜色。

Windows在矩形的背景区域中显示文字,它可能根据背景模式的设定进行著色,也可能不这样做。您可以使用

<span style="font-size:18px;">1.SetBkMode (hdc, iMode) ;  </span>

更改背景模式,其中iMode的值为OPAQUE或TRANSPARENT。内定的背景模式为OPAQUE,它表示Windows使用背景颜色来填充矩形的背景。您可以使用

<span style="font-size:18px;">1.SetBkColor (hdc, rgbColor) ;  </span>

来改变背景颜色。rgbColor的值是转换为纯色的值。内定背景色是白色。

如果两行文字靠得太近,其中一个的背景矩形就会遮盖另一个的文字。由於这种原因,我通常希望内定的背景模式是TRANSPARENT。在背景模式为TRANSPARENT的情况下,Windows会忽略背景色,也不对矩形背景区域著色。Windows也使用背景模式和背景色对点和虚线之间的空隙及阴影刷中阴影间的区域著色,就像第五章所讨论的那样。

许多Windows程式将WHITE_BRUSH指定为Windows用於擦出视窗背景的画刷,画刷在视窗类别结构中指定。然而,您可能希望您程式的视窗背景与使用者在「控制台」中设定的系统颜色保持一致,在这种情况下,可以在WNDCLASS结构中指定背景颜色的这种方式:

<span style="font-size:18px;">1.wndclass.hbrBackground = COLOR_WINDOW + 1 ;</span>

当您想要在显示区域书写文字时,可以使用目前系统颜色设定文字色和背景色:

<span style="font-size:18px;">1.SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;  2.SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;  </span>

完成这些以後,就可以使您的程式随系统颜色的更改而变化:

<span style="font-size:18px;">1.case    WM_SYSCOLORCHANGE :  2.        InvalidateRect (hwnd, NULL, TRUE) ;  3.        break ;  </span>

另一个影响文字的装置内容属性是字元间距。它的预设值是0,表示Windows不在字元之间添加任何空间,但您可以使用以下函式插入空间:

<span style="font-size:18px;">1.SetTextCharacterExtra (hdc, iExtra) ;  </span>

参数iExtra是逻辑单位,Windows将其转换为最接近的图素,它可以是0。如果您将iExtra取为负值(希望将字元紧紧压在一起),Windows会接受这个数值的绝对值─也就是说,您不能使iExtra的值小於0。您可以通过呼叫GetTextCharacterExtra取得目前的字元间距,Windows在传回该值前会将图素间距转换为逻辑单位。

使用备用字体

当您呼叫TextOut、TabbedTextOut、ExtTextOut、DrawText或DrawTextEx书写文字时,Windows使用装置内容中目前选择的字体字体定义了特定的字样和大小。以不同字体显示文字的最简单方法是使用Windows提供的备用字体,然而,它的范围是很有限的。

您可以呼叫下面的函式取得某种备用字体的代号:

<span style="font-size:18px;">1.hFont = GetStockObject (iFont) ; </span>

其中,iFont是几个识别字之一。然後,您就可以将该字体选入装置内容:

<span style="font-size:18px;">1.SelectObject (hdc, hFont) ;  </span>

这些您也可以只用一步完成:

<span style="font-size:18px;">1.SelectObject (hdc, GetStockObject (iFont)) ;  </span>

在内定的装置内容中选择的字体称为系统字体,能够由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 BoldItalic

Times New Roman

Times New Roman Bold

Times New RomanItalic

Times New Roman BoldItalic

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英寸很接近──它们非常接近,因此在电脑中它通常定义为1/72英寸。点值通常描述为字母顶端(不包括发音符号)到字母底端的高度,例如,字母「bq」的总高度。这是一个考虑字体大小的简单方式,但它通常不是很精确。

字体的点值实际上是排版设计的概念而不是度量概念。特定字体中字元的大小可能会大於或小於其点值所表示的大小。在传统的排版中,您使用点值来指定字体的大小,在电脑排版中,还有其他方法来确定字元的实际大小。

间隔和间距

在第四章我们曾提到,可以通过呼叫GetTextMetrics取得装置内容中目前选择的字体资讯,我们也多次使用过这个函式。图4-3显示了FONTMETRIC结构中字体的垂直大小。

TEXTMETRIC结构的另一个栏位是tmExternalLeading,词「间隔(leading)」来自排字工人在金属字块间插入的铅,它用於在两行文字之间产生空白。tmInternalLeading值与为发音符号保留的空间有关,tmExternalLeading表示字元的连续行之间所留的附加空间。程式写作者可以使用或忽略外部的间隔值。

当我们说一个字体是8点或12点时,指的是不带内部间隔的高度。某种大写字母上的发音符号占据了分隔行的间距。这样,TEXTMETRIC结构的tmHeight值实际指行间距而不是字体的点值。字体的点值可由tmHeight减tmInternalLeading得到。

逻辑英寸问题

正如我们在第五章〈设备的大小〉一节中所讨论的,Windows98将系统字体定义为带有12点行距的10点字体。根据在「显示属性」对话方块中选择的是「小字体」还是「大字体」,该字体的tmHeight值为16或20图素,tmHeight减去tmInternalLeading的值为13或16图素。这样,字体的选择就暗指以每英寸的点数为单位的设备解析度,选择「小字体」即为96dpi,选择「大字体」即为120dpi。

您可以用LOGPIXELSX或LOGPIXELSY参数呼叫GetDeviceCaps来取得该设备解析度。因此,96或120图素在萤幕上占有的度量距离可以称为「逻辑英寸」。如果您用尺测量萤幕并计算图素,就可能发现逻辑英寸要比实际的英寸大一些,为什么会这样呢?

在纸张上,每英寸放设14个8点的字元很方便阅读。如果您在作文书处理或写作应用程式时,可能希望在显示器上显示清晰的8点字型,但如果使用视讯显示器的实际尺寸,就没有足够的图素清晰地显示字元。即使显示器具有足够的解析度,在萤幕上阅读8点字体仍然会有问题。当人们阅读纸上的印刷物时,眼睛与文字的距离通常为一英尺,而使用视讯显示器时,这个距离通常为两英尺。

逻辑英寸有效地对萤幕进行了放大,能够显示小至8点的清晰字体。而且,每英寸96点使640图素的最小显示大小等於大约6.5英寸。这恰恰是在页边距为1英寸的8.5英寸宽的纸上列印的文字的宽度。因而,逻辑英寸也利用了萤幕宽度,尽可能大地显示文字

您可能还记得在第五章,Windows NT的做法有些不同。在Windows NT中,从GetDeviceCaps中得到的LOGPIXELSX(每英寸的图素数)值不等於HORZRES值(图素数)除以HORZSIZE值(毫米数)再乘以25.4的值。以此类似,LOGPIXELSY、VERTRES和VERTSIZE也不一致。Windows在为不同映射方式计算视窗和偏移范围时,使用HORZRES、HORZSIZE、VERTRES和VERTSIZE值。然而,显示文字程式最好不要使用根据LOGPIXELSX和LOGPIXELSY使用假定的显示解析度,这一点与Windows 98更为一致。

所以,在Windows NT下,当程式以特定的点值显示文字时,它可能不使用Windows提供的映射方式,程式根据与Windows 98一样的每英寸的逻辑图素数来定义自己的映射方式。我将这种用於文字的映射方式称为「Logical Twips」映射方式。您可以设定如下:

<span style="font-size:18px;">1.SetMapMode  (hdc, MM_ANISOTROPIC) ;  2.SetWindowExtEx   (hdc, 1440, 1440, NULL) ;  3.SetViewportExt   (hdc,  GetDeviceCaps (hdc, LOGPIXELSX),  4.                        GetDeviceCaps (hdc, LOGPIXELSY), NULL) ;  </span>

使用这种映射方式设定,您能够以点值的20倍来指定字体大小,例如,为12点字取240。注意,与MM_TWIPS映射方式不同,y值在萤幕中向下增长,这在显示文字的连续行时很方便。

请记住,逻辑英寸与实际英寸间的差异仅对显示器存在。在列印设备上,GDI和尺是完全一致的。

逻辑字体

既然我们已经明确了逻辑英寸和逻辑单位的概念,那么现在我们就来讨论逻辑字体

逻辑字体是一个GDI物件,它的代号储存在HFONT型态的变数中,逻辑字体字体的描述。和逻辑画笔及逻辑画刷一样,它是抽象的物件,只有当应用程式呼叫SelectObject将它选入装置内容时,它才成为真实的物件。例如,对於逻辑画笔,您可以为画笔指定任意的颜色,但是在您将画笔选入装置内容时,Windows才将其转换为设备中有效的颜色。只有此时,Windows才知道设备的色彩能力。

逻辑字体的建立和选择

您可以透过呼叫CreateFont或CreateFontIndirect来建立逻辑字体。CreateFontIndirect函式接受一个指向LOGFONT结构的指标,该结构有14个栏位。CreateFont函式接受14个参数,它们与LOGFONT结构的14个栏位形式相同。它们是仅有的两个建立逻辑字体的函式(我提到这一点,是因为Windows中有许多用於其他字体操作的函式)。因为很难记住14个栏位,所以很少使用CreateFont。因此,我主要讨论CreateFontIndirect。

有三种基本的方式用於定义LOGFONT结构中的栏位,以便呼叫CreateFontIndirect:

  • 您可以简单地将LOGFONT结构的栏位设定为所需的字体特徵。在这种情况下,在呼叫SelectObject时,Windows使用「字体映射」演算法从设备上有效的字体中选择与这些特徵最匹配的字体。由於这依赖於视讯显示器和印表机上的有效字体,所以其结果可能与您的要求有相当大的差别。
     
  • 您可以列举设备上的所有字体并从中选择,甚至用对话方块把它们显示给使用者。我将在本章後面讨论字体列举函式。不过,它们现在已经不常用了,因为第三种方法也可以进行列举。
     
  • 您可以采用简单的方法并呼叫ChooseFont函式,我在第十一章曾讨论过这个函式,能够使用LOGFONT结构直接建立字体
     

在本章,我使用第一种和第三种方法。

下面是建立、选择和删除逻辑字体的程序:

  1. 通过呼叫CreateFont或CreateFontIndirect建立逻辑字体,这些函式传回HFONT型态的逻辑字体代号。
  2. 使用SelectObject将逻辑字体选入装置内容,Windows会选择与逻辑字体最匹配的真实字体
  3. 使用GetTextMetrics(及可能用到的其他函式)确定真实字体的大小和特徵。在该字体选入装置内容後,可以使用这些资讯来适当地设定文字的间距。
  4. 在使用完逻辑字体後,呼叫DeleteObject删除逻辑字体,当字体选入有效的装置内容时,不要删除字体,也不要删除备用字体

GetTextFace

函式使程式能够确定目前选

入装置内容的字体名称:

<span style="font-size:18px;">1.GetTextFace (hdc, sizeof (szFaceName) / sizeof (TCHAR), szFaceName) ;  </span>

详细的字体资讯可以从GetTextMetrics中得到:

<span style="font-size:18px;">1.  GetTextMetrics (hdc, &textmetric) ;  </span>

其中,textmetric是TEXTMETRIC型态的变数,它具有20个栏位。

稍後我将详细讨论LOGFONT和TEXTMETRIC结构的栏位,这两个结构有一些相似的栏位,所以它们容易混淆。现在您只需记住,LOGFONT用於定义逻辑字体,而TEXTMETRIC用於取得目前选入装置内容中的字体资讯。

 

.....未完待续,文章链接:http://www.verydemo.com/demo_c173_i71344.html

 

 

 

0 0
原创粉丝点击