Вопрос

Я визуализирую текст в Direct2D/DirectWrite, но вызываю SetLineSpacing() ни на TextFormat, ни на TextLayout, похоже, не имеет никакого эффекта.Кто-нибудь знает, почему?

Это было полезно?

Решение

Я на 99% уверен, что это баг. В последнее время я немного поигрался с Direct2D, и у меня тоже возникла проблема с SetLineSpacing() на TextLayout думаю, что это то же самое, что вы описываете, в этом случае я могу подтвердить, что это касается не только вас.Снова откройте отчет об ошибке в MS Connect, он был закрыт.

Другие советы

У меня даже такая же проблема, как сказал Дмитрий Нестерук.

Однако, я узнаю, что если вы установите lineSpacing "после CreateTextLayout", SetLineSpacing не работает.

В противном случае, если вы установите LineSpacing перед CreateTextLayout, теперь он может работать.

Может быть, вы можете попробовать это решение.

ПС:Моя среда.находится в Windows Vista SP2.

Большое спасибо.

К сожалению, вы не предоставляете код, показывающий, что вы пытаетесь сделать.Я предполагаю, что вы пытаетесь установить межстрочный интервал следующим образом:

pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);

В документации MSDN не очень ясно описаны различные методы межстрочного интервала.Метод по умолчанию приводит к тому, что интервал для каждой строки определяется на основе используемого шрифта и встроенных объектов, если таковые имеются, поэтому каждая строка имеет высоту, которая должна быть в соответствии с ее содержимым.В этом случае два параметра lineSpacing и baseline, игнорируются.

Если у вас есть текстовый формат, в котором используется один шрифт (и размер шрифта) и нет встроенных объектов (или встроенных объектов, которые не выше текста), вы можете указать единый межстрочный интервал.Это то, что DWRITE_LINE_SPACING_METHOD_UNIFORM для.Я только что попробовал и позвонил SetLineSpacing() этот метод приводит к равномерному межстрочному интервалу в соответствии с переданными аргументами.

Начиная с Windows 10, существует третий метод межстрочного интервала: DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, который можно использовать для достижения межстрочного интервала, соответствующего размеру шрифта и встроенным объектам.Однако это поддерживается только в Windows 10.

По моему опыту, самое заблуждение заключается в том, что вызов SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) завершается успешно без ошибок, а затем получает параметры межстрочного интервала, используя GetLineSpacing() метод возвращает предоставленные значения (хотя они все равно ничего не достигают).В этом отношении API внутренне согласован и не отбрасывает указанные значения, даже если они не приносят никакой пользы.Кроме того, когда вы звоните GetLineSpacing() на вновь созданном IDWriteTextFormat или IDWriteTextLayout Например, значения возвращаются как ноль (что правильно, поскольку метод межстрочного интервала DWRITE_LINE_SPACING_METHOD_DEFAULT).Чтобы иметь возможность сделать что-нибудь полезное, вам необходимо определить межстрочный интервал по умолчанию для используемого вами шрифта.Вы можете добиться этого, позвонив IDWriteFont::GetMetrics() на шрифте, который вы используете.Межстрочный интервал по умолчанию представляет собой сумму ascent, descent и lineGap ценности.

Об этом писал Чарльз Петцольд в статье о Пагинация с помощью DirectWrite.

Я что-то пропустил?

Ни один IDWriteTextFormat ни IDWriteTextLayout имеет функцию SetLineHeight...

Вы проверили HRESULT код ошибки, возвращенный SetLineSpacing()?

Намекать:Если вы используете Visual Studio, просто введите eax,hr в одном из окон просмотра отладки, чтобы увидеть любой возможный код ошибки сразу после вызова.

Источник

минимальный поддерживаемый клиент:Windows 7, Windows Vista с пакетом обновления 2 (SP2) и обновление платформы для Windows Vista.

Используете ли вы какую-либо из указанных выше версий Windows?Я считаю, что причина, по которой вы не видите никаких изменений, заключается в том, что любая версия ниже приведенной выше не поддерживает SetLineSpacing() в DirectWrite.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top