我正在尝试将一系列UNICODE字符呈现到一张Spritesheet上。这对于大多数角色(包括西里尔字母)都非常有效。
但是,将GetCharABCWidthsFloat
与某些CJKV字符一起使用时,ABCFLOAT::abcfB
参数提供的值比预期的要低。它不考虑悬垂或悬垂,这是ABC的确切目的:
B间距是字符字形的绘制部分的宽度。
如您所见,除最后几个字符外,所有字符都没有从左到右重叠:
我避开此通过创建一个定制的填充选项,来处理这样的情况下,但这个涨大的字形的其余部分,因而需要较大的表面:
正在使用的字体是Arial。对于字符美
,ABC返回(2,10,2),该总和到一个预先的14个像素,而事实上,需要17个像素。
我使用TextOut
实际呈现字形的,但我不知道是否有一个人在那里谁是经历过这个,用通用的解决方案上来。
使用GetTextExtentPoint32W
或DrawTextEx
之类的函数来获取矩形不允许精确的按字符放置,这是ABC的重点。而且某些未提及的功能仅适用于TrueType字体。
我质疑在某些情况下某些字符是否转换为其他字体,从而导致结果不准确。如果是这样的话,有没有一种方法来确定字符是否不可用于字体,知道什么是Windows会自动不这样我就可以重现该问题?也就是说,是否有某种方式来确定当一个字符应该求助于另一种字体,和一种方法来确定该字体应该是什么?
我已经在这个问题上待了很长时间了,因此任何有使用这些API经验的人都会受到欢迎!
答案 0 :(得分:0)
摘自GetCharABCWidthsFloat上的文档:
默认字符的ABC宽度用于当前所选字体范围之外的字符。
Arial包含许多字符,包括西里尔字母,但不包含CJKV表意文字。其他与文本相关的调用可能会给您一种错误的印象,即它确实具有这些字符(通过默认/后备字体机制)。
在使用(可能在获取之前)ABCFLOAT之前,您应该首先检查要度量的字符是否在当前所选字体的范围内。