2014-10-16 9 views
2

Я хотел бы определить реальную высоту строки шрифта на основе шрифта, взятого из системы. Шрифт, который я использую, - это значок значка системы.Как определить интервал строк в пикселях от заданного шрифта (для 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; 

Кажется, работает хорошо для всех размеров шрифта Я проверил с (для больших шрифтов это бит более жесткий, но это нормально).

+0

Я думаю, вы не хотите использовать GDI +, или ...? (спрашивая, потому что методы, используемые в этой статье MSDN, могут быть довольно легко извлечены, например, ['GetLineSpacing'] (http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/FontFamily.cs# 518), но они являются GDI +). – TLama

+0

Мне просто нужно измерить межстрочный интервал, если он совместим с Windows XP или более поздней версией, тогда мне хорошо. – Coder12345

+0

Если вы хотите получить фактическую высоту шрифта, попробуйте http://stackoverflow.com/questions/6804929/how-do-determine-the-height-of-a-line-of-text-in-a -tmemo-программно – fuchs777

ответ

1

Я использовал этот код, чтобы вычислить прямоугольник, необходимый для отображения блока текста, может быть some полезна для вас:

Это приспособление от моего оригинального кода, но это должно дать вам идею : 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, но он не работает нормально, либо давая мне больше или меньше, чем было на самом деле необходимо. Таким образом, у меня не было проблем с полученной высотой.

+0

Я изучил это, и кажется, что это дает хорошие значения ... Я рассмотрю его еще немного, это может быть так! – Coder12345

+0

Я думал, что вы можете передать несколько многострочных текстов, скажем, 'Wq \ njÑ' и разделить результат между количеством строк, и вы получите среднюю высоту строки. Моя проблема с TextHeight была на самом деле с многострочным текстом, поскольку расчет, который он дал, всегда был выключен. С помощью этого метода высота соответствует правилу того, что ожидает пользователь, но, возможно, передача одного символа или двух не позволяет этому учитывать межстрочный интервал. –

+0

После дальнейшего тестирования я обнаружил, что 'DrawText' и' TextHeight' возвращают идентичные значения.Нет необходимости делиться с несколькими строками, одна строка возвращает всегда одинаковое значение, даже если вы вставляете текст 'AA' или' Wq', это всегда одна и та же высота. Я пересмотрел формулу в своем исходном сообщении, которое, похоже, работает нормально. Даже Windows Explorer посещает шрифты с большим DPI в Windows 8.1, что очень странно, и приведенная выше формула работает лучше, чем Windows Explorer. – Coder12345

 Смежные вопросы

  • Нет связанных вопросов^_^