请输入您要查询的百科知识:

 

词条 文字输出函式
释义

§ 简介

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

TextOut (hdc, xStart, yStart, pString, iCount) ;

参数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等字母下部的线。

§ 说明

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

TabbedTextOut (        hdc, xStart, yStart, pString, iCount,

iNumTabs, piTabStops, xTabOrigin) ;

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

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

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

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

ExtTextOut (hdc, xStart, yStart, iOptions, &rect,

pString, iCount, pxDistance) ;

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

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

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

DrawText (hdc, pString, iCount, &rect, iFormat) ;

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

当iFormat设定为0时,Windows会将文字解释为一系列由carriage return字元(‘\\r’或0x0D)或linefeed字元(‘\’或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来解决,它含有一个额外的参数:

DrawTextEx (hdc, pString, iCount, &rect, iFormat, &drawtextparams) ;

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

typedef struct tagDRAWTEXTPARAMS

{

UINT         cbSize ;                              // size of structure

int         iTabLength ;                   // size of each tab stop

int         iLeftMargin ;                    // left margin

int         iRightMargin ;                  // right margin

UINT         uiLengthDrawn ;                 // receives number of characters processed

} DRAWTEXTPARAMS, * LPDRAWTEXTPARAMS ;

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

随便看

 

百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/19 9:02:13