我想根据系统中的字体确定真实的字体行高。我使用的字体是系统图标字体。
到目前为止,这是我的代码。
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;
对于我测试过的所有字体大小,似乎都可以正常工作(对于较大的字体,它有点紧,但没关系)。
答案 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之前使用过,但它并没有正常工作,要么比我真正需要的更多或更少。这样我就不会产生任何问题。