GetTextMetrics 返回 Courier New 的不同最大和平均字符宽度

2023-12-07

我正在使用在 Windows 7 上运行的 Borland C++ Builder 6 维护一个应用程序。

应用程序错误地使用 Courier New 字体绘制文本,因为每个字母都被轻微切断。问题在于调用方法 GetTextMetrics 时,因为它使用不同的 tmAveCharWidth 和 tmMaxCharWidth 值填充 TEXTMETICS 结构。然后应用程序使用 tmAveCharWidth 计算字符宽度是错误的,因为该值可能小于 tmMaxCharWidth。我将解决这个问题。

我很好奇为什么 GetTextMetrics 为 Courier New 返回不同的 tmAveCharWidth 和 tmMaxCharWidth 值?我的理解是 Courier New 是等宽字体,并且 tmAveCharWidth 和 tmMaxCharWidth 应该相同。我用其他等宽字体测试了这个假设是正确的。

这是有问题的代码部分:

hFont = CreateFontIndirect(&lpInstData->lf);

hDC = GetDC(hWnd);
hFontOld = SelectObject(hDC, hFont);


GetTextMetrics(hDC, &tm);
lpInstData->nCharHeight = tm.tmHeight;
lpInstData->nCharWidth = tm.tmAveCharWidth; <--- Should be using tmMaxCharWidth 

这是当我选择尺寸 12 Courier New 时运行的代码。

传递给 CreateFontIndirect 的参数

从 GetTextMetrics 返回的 TEXTMETRICS 结构


我发现这确实是 ClearType 在工作(感谢 Deanna)。关闭 ClearType 可以在不更改任何代码的情况下纠正显示问题,但我仍然需要纠正应用程序与 ClearType 的配合方式。

我还发现 Windows XP 上不存在该问题,因为 ClearType 默认情况下处于关闭状态,而在 Windows 7(和 Vista)中它默认处于打开状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetTextMetrics 返回 Courier New 的不同最大和平均字符宽度 的相关文章

随机推荐