我正在使用在 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 时运行的代码。