词条 | 文字输出函式 |
释义 | § 简介 我已经在许多范例程式中使用过最常用的文字输出函式: 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。