当ClearType开启时如何获取真实文本尺寸?

4
我有一个使用GDI的Win32 GUI应用程序。它需要在指定的坐标上绘制文本并稍后将其擦除并替换为原始位图。
我按照以下步骤进行操作:
- 将字体(GetStockObject(DEFAULT_GUI_FONT))、刷子和其他内容选择到设备上下文中。 - 调用GetTextExtentPoint32()计算文本的大小。 - 现在,有了文本起点,我可以计算预期的文本矩形并存储它。 - 对于同一设备上下文,使用相同的起始点和相同的文本调用TextOut()。
稍后恢复存储矩形中的位图。
当ClearType抗锯齿关闭时,它可以正常工作。但是,当ClearType开启时,由GetTextExtentPoint32()返回的大小略小于TextOut()调用时文本实际占用的大小。因此,当我稍后恢复原始位图时,一些小条纹的文本仍然保留在原地,从而产生了伪影。
是否有任何方法可以解决这个问题,而不禁用ClearType?
1个回答

2
你也可以尝试使用DrawText和DT_CALCRECT来计算字符串的大小,这可能会更好地解决问题。
此外,你可以在一个大小与DT_CALCRECT相等的矩形中使用DrawText写入字符串,如果文本有点大,它将会被裁剪。

使用DrawText两次——首先进行大小计算,然后进行绘制,这样做非常好,文本不会变宽。谢谢。 - sharptooth
2
DrawText的缺点是它仅支持零逃逸和方向的字体。 - sharptooth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接