如何从字体对象中自动计算字体宽度?

时间:2011-05-19 07:57:37

标签: c++ mfc

我使用固定大小的字体(例如:“Courier New”)。当我通过调用CFont :: CreateFont函数初始化CFont对象时,我只想指定字体高度。

CFont Font;
Font.CreateFont( nFontHeight, 0, 0, 0, 0, false, false,
    0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    FIXED_PITCH|FF_MODERN, _T("Courier New") );

根据文档,字体宽度将自动计算。我需要为其他一些计算自动计算值。

GetLogFont函数没用,因为看起来CFont只保存我们给出的值width = 0并且它仅在第一次使用时计算该值。 (请查看Microsoft documentation

另一个选择是使用单个字符使用CDC :: GetTextExtent。但在这种情况下,我甚至可以看到一些微小的差异,即使在高度。例如,当我将-32作为高度时,GetTextExtent为y值返回33。

有没有办法获得正确的计算宽度?

2 个答案:

答案 0 :(得分:3)

首先,如果您只想指定字体高度,通常需要使用CreatePointFont。其次,Windows 95/98 / SE / Me已经死了 - 并且与他们一起,基本上所有理由都使用微软的“文本”宏,如_T("whatever")。如果你想要宽字符,请直接询问:

CFont font;   
font.CreatePointFont(nFontHeight, L"Courier New");

然后,正如@MikMik建议的那样,您可以使用GetTextMetrics来获取宽度 - 但只有 后才能选择字体到DC(GetTextMetrics获取选择DC的字体数据,不仅仅是原始字体 - 特别是在小字体大小时,有些东西会被调整以补偿输出设备的分辨率。)

但请注意,即使对于固定宽度的字体,字符串的宽度也不必须char_width * num_chars。至少如果我没记错的话,即使是固定宽度的字体仍然可以被调整,这意味着根据一起出现的字符对来调整间距。典型的例子是像AV这样的一对。因为它们彼此相邻的线通常处于相同的角度(或者至少非常接近相同的角度),所以将调整间距以使它们更靠近在一起 - 事实上,“V”的顶部将是经常与“A”的底部重叠。即使每个单独的字符具有相同的宽度,字符串的宽度也可以变化。

副手,我不确定Courier New是否会这样做,但我确信至少有一些固定宽度的字体可以做到。

答案 1 :(得分:2)

你试过CDC::GetTextMetrics()吗?我从来没有使用它,但它似乎是你正在寻找的。您可以获得平均和最大字符宽度,我猜Courier New应该是相同的。