我使用Borland C++ Builder 6在Windows 7上运行一个应用程序。
应用程序使用字体信使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号信使新时运行的代码。
Parameter passed to CreateFontIndirect
TEXTMETRICS structure returned from GetTextMetrics

最佳答案

我发现这在工作中确实很清晰(谢谢迪安娜)。关闭ClearType可以在不更改任何代码的情况下更正显示问题,尽管我仍然需要更正应用程序如何使用ClearType。
我还发现这个问题在Windows XP上不存在,因为ClearType在默认情况下是关闭的,而在Windows 7(和Vista)中,它在默认情况下是打开的。

09-11 20:37