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

时间:2012-04-23 11:32:02

标签: c winapi windows-7 font-size c++builder-6

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

应用程序使用字体Courier New错误地绘制文本,因为每个字母都被轻微切断。问题是在调用方法GetTextMetrics时,因为它填充了TEXTMETICS结构,其中包含不同的tmAveCharWidth和tmMaxCharWidth值。然后应用程序使用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时运行的代码。

Parameter passed to CreateFontIndirect

TEXTMETRICS structure returned from GetTextMetrics

1 个答案:

答案 0 :(得分:0)

我发现这确实是ClearType在工作中(感谢Deanna)。关闭ClearType会更正显示问题而不更改任何代码,但我仍需要更正应用程序如何使用ClearType。

我还发现Windows XP上没有此问题,因为默认情况下ClearType处于关闭状态,而在Windows 7(和Vista)中,默认情况下它处于启用状态。