Я получаю другую высоту шрифта из метрики текста шрифта DirectWrite, чем я запрашивал в качестве параметра высоты

Кто-нибудь может объяснить это?

Код ниже:

// - change font size to specified point(pt) size.
// - returns false if there is an error, or true otherwise.

bool GraphicsDirect2D::TextSetFontSize(int size)
{

if (size <= 0)
{
    assert(0 && "Error: Invalid size parameter.");
    return false;
}

// if size has not changed, return
float currentFontSizeDIP = m_pDWTextFormat->GetFontSize();
float currentFontSizePoints = ConvertDIPToPointSize(currentFontSizeDIP);

if (currentFontSizePoints == size)
    return true;

// otherwise, create new object for new text size
IDWriteTextFormat *pNewTextFormat = NULL;


if (FAILED(m_pDWFactory->CreateTextFormat(
    StringToWString(m_textCurrentSettings.strFont).c_str(),
    NULL,
    DWRITE_FONT_WEIGHT_REGULAR,
    DWRITE_FONT_STYLE_NORMAL,
    DWRITE_FONT_STRETCH_NORMAL,
    ConvertPointSizeToDIP(size),
    L"en-us",
    &pNewTextFormat)))
{
    assert(0 && "Error.");
    return false;
}



{
    IDWriteTextLayout *m_pDWTextLayout = NULL;
    DWRITE_TEXT_METRICS tm;

    if (FAILED(m_pDWFactory->CreateTextLayout(
        L"Arial",
        0,
        pNewTextFormat,
        100,
        100,
        &m_pDWTextLayout)))
    {
        Destroy();
        assert(0 && "Error.");
        return false;
    }

    if (FAILED(m_pDWTextLayout->GetMetrics(&tm)))
    {
        assert(0 && "Error.");
    }

    m_fontHeight = tm.height;

    m_pDWTextLayout->Release();
}       


// release the old object
if (m_pDWTextFormat)
{
    m_pDWTextFormat->Release();
    m_pDWTextFormat = NULL;
}

// and point to the new one
m_pDWTextFormat = pNewTextFormat;

m_textCurrentSettings.size = size;

return true;
}

Эта функция из класса, который я использую для предоставления графического интерфейса для Direct2D (и DirectWrite для текста). Функция заменяет шрифт, который она хранит, как "текущий", на новый размер и обновляет переменную размера для справки.

Проблема в том, что если я передам 16 функции (например), шрифт, который мне дают, будет БОЛЬШЕ, чем размер точки 16 при создании с использованием Direct2D. (При использовании WinGDI на экране отображается мой эталонный размер 16). Функция Win32 является моим эталоном, а версия DirectD создает больший шрифт, чем код Win32.

Я преобразовал введенный размер точки в эту функцию, как мне кажется, для предоставления значений DIP в функцию Direct2D CreateTextFormat(). Затем я создаю макет со строкой длины 0, чтобы получить высоту для созданного шрифта по умолчанию. Это тогда отличается от того, что я просил начать с...

Я не могу найти документацию, которая описывает это достаточно подробно, чтобы разобраться в этом. Каждый сайт о функциях и структурах просто попугайует то же самое, что веб-сайт Windows говорит о содержимом структуры. (Grrrr!!) Нигде в действительности не говорится, находится ли вывод метрической функции текста в DIP или нет, я предполагаю, что это так, но не вижу очевидного преобразования из другого формата, чтобы вернуться к 16!! Пожалуйста помоги:)

Спасибо

0 ответов

Другие вопросы по тегам