Я хотел бы определить реальную высоту строки шрифта на основе шрифта, взятого из системы. Шрифт, который я использую, - это значок значка системы.Как определить интервал строк в пикселях от заданного шрифта (для TVirtualTreeView)
Вот мой код.
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;
}
Теперь вот в чем проблема. Вышеописанная высота текста составляет 13 пикселей для размера шрифта по умолчанию при 96 DPI. Но для хорошего тона и межстрочного интервала должно быть 18. Разница увеличивается при увеличении DPI или увеличении размера шрифта. Если для VirtualTreeView DefaultNoteHeight установлено значение 13 пикселей, все выглядит очень плотно, а линии слишком близки друг к другу.
Что мне нужно знать, на самом деле расстояние между строками, как описано здесь: http://msdn.microsoft.com/en-us/library/xwf9s90b%28v=VS.71%29.aspx
Пожалуйста, объясните, как извлечь межстрочный интервал из заданного шрифта из системы.
Я считаю, что GetTextMetrics
держит ключ, но я просто пропустил небольшой кусок головоломки, чтобы собрать все вместе, как использовать его вместе с выше.
Примеры в Delphi также приветствуются не обязательно в C++ Builder.
Update:
Я пересмотрел формулу немного, добавив:
H = bmp->Canvas->TextHeight("Wq");
// Take care of smaller heights to make them minimum 18 pixels
H = (H < 18)? 18 : H;
Кажется, работает хорошо для всех размеров шрифта Я проверил с (для больших шрифтов это бит более жесткий, но это нормально).
Я думаю, вы не хотите использовать GDI +, или ...? (спрашивая, потому что методы, используемые в этой статье MSDN, могут быть довольно легко извлечены, например, ['GetLineSpacing'] (http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/FontFamily.cs# 518), но они являются GDI +). – TLama
Мне просто нужно измерить межстрочный интервал, если он совместим с Windows XP или более поздней версией, тогда мне хорошо. – Coder12345
Если вы хотите получить фактическую высоту шрифта, попробуйте http://stackoverflow.com/questions/6804929/how-do-determine-the-height-of-a-line-of-text-in-a -tmemo-программно – fuchs777