windows程序设计 文字和字体

文字和字体

简单的文字输出

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

文字输出函数

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

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

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

您应该还记得,第四章的一系列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字符(‘\n’或0x0A)分隔的行。文字从矩形的左上角开始,carriage return字符或linefeed字符被解释为换行字符,因此Windows会结束目前行而开始新的一行。新的一行从

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值