如何确定给定字体的行间距(对于TVirtualTreeView)

时间:2014-10-16 12:45:40

标签: delphi fonts c++builder virtualtreeview

我想根据系统中的字体确定真实的字体行高。我使用的字体是系统图标字体。

到目前为止,这是我的代码。

LOGFONTW lf;
ZeroMemory(&lf, sizeof(lf));
// Get icon font size from the system    
if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
    {
    int H = 7;
        {
        // Create TBitmap and TFont
        boost::scoped_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
        boost::scoped_ptr<TFont> fnt(new TFont);

        // Assign font from the system
        fnt->Name   = lf.lfFaceName;
        fnt->Height = lf.lfHeight;
        bmp->Canvas->Font->Assign(fnt.get());

        // Calc height (returns 13 for default font size, 96 DPI but should be more like 18)
        H = bmp->Canvas->TextHeight("Wq");
        }

    VST->DefaultNodeHeight = H;
    VST->Font->Name        = lf.lfFaceName;
    VST->Font->Height      = lf.lfHeight;
    }

现在问题就在于此。以上计算文本高度,在96 DPI时默认字体大小为13像素。但实际上它应该是18个很好的音高和线间距。随着DPI的增大或字体尺寸的增大,差异也会增大。如果将VirtualTreeView DefaultNoteHeight设置为13像素,则它们看起来非常紧,并且线条彼此距离太近。

我需要知道的是实际行间距,如下所述: http://msdn.microsoft.com/en-us/library/xwf9s90b%28v=VS.71%29.aspx

请解释如何从系统中提取给定字体的行间距。

我相信GetTextMetrics拥有关键,但我只是错过了一小部分难题,将它们整合在一起如何与上述一起使用。

Delphi中的示例也欢迎不必使用C ++ Builder。

更新

我通过添加以下内容修改了公式:

H = bmp->Canvas->TextHeight("Wq");
// Take care of smaller heights to make them minimum 18 pixels
H = (H < 18)? 18 : H;

对于我测试过的所有字体大小,似乎都可以正常工作(对于较大的字体,它有点紧,但没关系)。

1 个答案:

答案 0 :(得分:1)

我已经使用此代码来计算显示文本块所需的矩形,它可能对你有用:

它是我原始代码的改编版,但它应该给你一个想法:DT_CALCRECT是设置的标志,所以它返回所需的矩形。

RECT rc_ancho_en_gui;
int height = 0;

rc_ancho_en_gui.left = 0;
rc_ancho_en_gui.right = 100;
rc_ancho_en_gui.top = 0;
rc_ancho_en_gui.bottom = 100;

height = DrawText(BitmapHandle, "Wq", 2, &rc_ancho_en_gui, DT_CALCRECT | DT_WORDBREAK);

我在TextHeight之前使用过,但它并没有正常工作,要么比我真正需要的更多或更少。这样我就不会产生任何问题。