确定用于渲染文本的字符的y位置

时间:2012-05-24 01:24:47

标签: c++ winapi text typography bitmap-fonts

我一直在使用自己的位图字体渲染器,虽然我相信我可能正确地使用了字符间距,但我不确定如何确定字符的y位置。例如,如果字母'a'的y位置为0,那么'*'或','会有什么?我一直在使用winapi函数GetCharABCWidthsFloatW来确定字符之间的间距,是否有另一个函数可以用来确定某种y偏移?

我最适合我的位图图像,所以它们的大小并不总是一样。

4 个答案:

答案 0 :(得分:0)

每个字符本身应该由文本呈现API在y方向上正确偏移(TextOutDrawText等),因此您应该有一个常量偏移量。我总是使用GetTextExtentPoint32获取字符串“Ag”的指标以获取一般指标,此外您还可以尝试GetTextMetrics

答案 1 :(得分:0)

GetTextMetrics是正确的答案。但是,demorge可能想说你需要用于Y坐标的字段是tmAscent(看一下结构。)

总高度为tmHeight。 tmAscent是从顶部到基线的距离。 tmDescent是基线和字体底部之间的距离。

因此,在大多数情况下,如果(x,y)坐标引用文本的左上角,则需要添加tmAscent。如果y坐标是底部,则减去tmDescent(+或 - 也取决于你是否颠倒了视口,但是你可以测试并看看你得到了什么。)

无论您是写“a”,“*”还是“j”,该信息都有效。所有角色的基线都相同。

答案 2 :(得分:0)

如果我理解正确:每个字形的位图最初都是相同的高度。然后修剪每个字形周围的所有备用空间,为每个字符创建一个最小位图。

这种情况下的答案很简单。创建修剪后的位图时,请记住从左侧和顶部(或左侧和底部,取决于您如何定位字形)删除的像素数。绘制位图时,可以使用保存的值调整坐标。

但是,如果您尝试使用字体指标来确定每个位图的修剪量,则不能。

答案 3 :(得分:0)

常规字体信息:

您正在寻找的是如何将文本放置标准化为“基线”或“原点”(相同的概念)。您可以使用ascent(上升)或下降(下降)来执行此操作,具体取决于您的坐标系。

http://www.freetype.org/freetype2/docs/tutorial/step2.html

这提供了一组与排版相关的非常好的示例图像。

常规位图字体信息:

现在,关于位图图像,确保它们都正确排列的最简单方法是在精灵表中为每个字符的位图表示设置相同的高度(宽度应根据实际字符宽度而不同)。如果你这样做,那么你可以根据共享的高度简单地排列所有内容。

如果要剪切字符周围的多余空格,则需要将剪切的值与字形一起存储在某个结构中,以便确定偏移量。如果API正在为您执行此操作,则它们可能具有上升/下降,原点/基线或行高类型方法,您可以在其中获取基于字符的完整维度,以便您可以正确执行此操作。

Api特定信息
编辑:根据其他答案,这里是您的API特定问题的相关链接:

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

TEXTMETRIC struct:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

tmAscent或tmDescent可用于帮助抵消y坐标。