Кто-нибудь может объяснить это?
Код ниже:
// - 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 !! Пожалуйста помоги 🙂
Спасибо
Задача ещё не решена.
Других решений пока нет …