GetCharABCWidthsFloat适用于大多数UNICODE,但CJKV字符除外

时间:2019-01-30 21:35:40

标签: winapi unicode fonts glyph asianfonts

我正在尝试将一系列UNICODE字符呈现到一张Spritesheet上。这对于大多数角色(包括西里尔字母)都非常有效。

但是,将GetCharABCWidthsFloat与某些CJKV字符一起使用时,ABCFLOAT::abcfB参数提供的值比预期的要低。它不考虑悬垂或悬垂,这是ABC的确切目的:

  

B间距是字符字形的绘制部分的宽度。

来源:ABCFLOAT | Microsoft Docs

如您所见,除最后几个字符外,所有字符都没有从左到右重叠:

Tight

我避开此通过创建一个定制的填充选项,来处理这样的情况下,但这个涨大的字形的其余部分,因而需要较大的表面:

Loose

正在使用的字体是Arial。对于字符,ABC返回(2,10,2),该总和到一个预先的14个像素,而事实上,需要17个像素。

我使用TextOut实际呈现字形的,但我不知道是否有一个人在那里谁是经历过这个,用通用的解决方案上来。

使用GetTextExtentPoint32WDrawTextEx之类的函数来获取矩形不允许精确的按字符放置,这是ABC的重点。而且某些未提及的功能仅适用于TrueType字体。

我质疑在某些情况下某些字符是否转换为其他字体,从而导致结果不准确。如果是这样的话,有没有一种方法来确定字符是否不可用于字体,知道什么是Windows会自动不这样我就可以重现该问题?也就是说,是否有某种方式来确定当一个字符应该求助于另一种字体,和一种方法来确定该字体应该是什么?

我已经在这个问题上待了很长时间了,因此任何有使用这些API经验的人都会受到欢迎!

1 个答案:

答案 0 :(得分:0)

摘自GetCharABCWidthsFloat上的文档:

  

默认字符的ABC宽度用于当前所选字体范围之外的字符。

Arial包含许多字符,包括西里尔字母,但包含CJKV表意文字。其他与文本相关的调用可能会给您一种错误的印象,即它确实具有这些字符(通过默认/后备字体机制)。

在使用(可能在获取之前)ABCFLOAT之前,您应该首先检查要度量的字符是否在当前所选字体的范围内。