Я получаю другую высоту шрифта из метрики текста шрифта 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector