2

我正在使用在 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 结构

4

1 回答 1

0

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

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

于 2012-04-24T09:55:48.693 回答