我正在使用在 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(使用前将#替换为@)