Вызовы ID2D1RenderTarget :: DrawTextLayout () не работают

В основном, с учетом следующего кода теста:

CComPtr<IDWriteTextLayout> layout;
wstring text2 = L"Here is some text.";
this->currentLevelText->Formatting->TextFactory->CreateTextLayout(text2.c_str(), text2.length(), this->matrixHeaderTextInfo->TextFormat, FLT_MAX, FLT_MAX, &layout);
target->DrawTextLayout(D2D1::Point2F(30, 30), layout, this->textBrush);

Метод target-> DrawTextLayout ничего не рисует. Однако следующий вызов DrawTextW работает:

target->DrawTextW(this->currentLevelText->Text.c_str(), this->currentLevelText->Text.length(),
this->currentLevelText->Formatting->TextFormat, this->currentLevelText->ActualRectangle.DrawingRectangle,
this->textBrush);

Вот краткое изложение того, что я знаю:

  • TextFactory — это указатель на объект IDWriteFactory, TextFormat — это объект IDWriteTextFormat, а target — допустимый ID2D1HwndRenderTarget.
  • TextFormat является допустимым объектом IDWriteTextFormat, так как я могу правильно рисовать текст с помощью метода DrawTextW.
  • Вызов CreateTextLayout не возвращает код ошибки, он возвращает код успеха S_OK.
  • TextFormat и объект текстового макета были созданы с использованием одной и той же фабрики DirectWrite, которая также является единственной фабрикой DirectWrite, существующей в моем приложении.
  • ID2D1SolidColorBrush textBrush является допустимой кистью с непрозрачностью 1.0 и установлен в черный цвет. Я знаю, что это не проблема, потому что DrawTextW использует эту кисть для успешного рисования в окне.
  • Вызов метода GetMetrics объекта ID2D1TextLayout возвращает допустимые метрики; другими словами, ширина и высота текста, хранящегося в объекте, не равна 0 или отрицательна.
  • Вызов ID2D1RenderTarget :: EndDraw () не возвращает код ошибки, он возвращает код успеха S_OK.
  • Больше всего сбивает с толку, в другом разделе моего кода (который находится в другом файле DLL), вызовы DrawTextLayout делать Работа. Хотя этот код находится в DLL-файле, он использует тот же DirectWrite Factory. Я действительно не думаю, что нахождение в другом файле DLL должно иметь значение.

Оба предоставленных мною примера кода выполняются один за другим, и оба должны успешно рисовать текст. Однако только DrawTextW рисует текст. Я не делаю ничего сложного с рисованием, например, используя прямые 2D-эффекты. Код не сложнее, чем примеры, которые я предоставил. Сейчас я могу просто использовать метод DrawTextW, но я бы предпочел этого не делать, поскольку я где-то читал, что просто создает объект IDWriteTextLayout, рисует его, а затем уничтожает объект. Это много ненужной работы, которую можно облегчить, используя сам объект текстового макета.

У кого-нибудь есть идеи, почему это может происходить? У меня совершенно нет идей о том, почему это происходит, хотя я буду продолжать пытаться найти связь где-нибудь.

0

Решение

Я верю, что нашел решение. Объект TextFormat был создан с выравниванием абзаца DWRITE_PARAGRAPH_ALIGNMENT_CENTER, выравниванием текста DWRITE_TEXT_ALIGNMENT_CENTER, а макет имеет размер ограничивающего прямоугольника FLT_MAX (имитировать границы, поэтому текст никогда не будет переноситься).

Я не осознавал этого, но DWRITE_PARAGRAPH_ALIGNMENT ссылается на вертикальный выравнивание текста. DWRITE_PARAGRAPH_ALIGNMENT_NEAR означает выравнивание по верху, DWRITE_PARAGRAPH_ALIGNMENT_FAR означает выравнивание по низу, а DWRITE_PARAGRAPH_ALIGNMENT_CENTER означает вертикальное выравнивание по центру.

Поскольку контейнер макета был FLT_MAX * FLT_MAX, текст не будет виден нигде на экране, независимо от того, какую исходную позицию я указываю, потому что он всегда будет на расстоянии около FLT_MAX / 2 пикселя в обоих направлениях: x и y.

Изменение выравнивания абзаца текстового формата с DWRITE_PARAGRAPH_ALIGNMENT_CENTER на DWRITE_PARAGRAPH_ALIGNMENT_NEAR было первым шагом к решению проблемы. Тем не менее, я заметил, что текст все еще не появляется. Я понял, что DWRITE_TEXT_ALIGNMENT_CENTER также не будет работать с шириной FLT_MAX, по той же причине, что выравнивание абзаца не работало, как я ожидал. Центрирование текста при ширине FLT_MAX для рисования снова приведет к тому, что текст будет удален от экрана вправо.

Таким образом, хотя использование FLT_MAX до сих пор не вызывало у меня проблем (мне не нужно было использовать выравнивание по центру до сих пор), конкретные ограничения по размерам для макета и использование выравнивания абзацев «рядом» — вот что решило мою проблему.

0

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

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

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