В основном, с учетом следующего кода теста:
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);
Вот краткое изложение того, что я знаю:
Оба предоставленных мною примера кода выполняются один за другим, и оба должны успешно рисовать текст. Однако только DrawTextW рисует текст. Я не делаю ничего сложного с рисованием, например, используя прямые 2D-эффекты. Код не сложнее, чем примеры, которые я предоставил. Сейчас я могу просто использовать метод DrawTextW, но я бы предпочел этого не делать, поскольку я где-то читал, что просто создает объект IDWriteTextLayout, рисует его, а затем уничтожает объект. Это много ненужной работы, которую можно облегчить, используя сам объект текстового макета.
У кого-нибудь есть идеи, почему это может происходить? У меня совершенно нет идей о том, почему это происходит, хотя я буду продолжать пытаться найти связь где-нибудь.
Я верю, что нашел решение. Объект 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 до сих пор не вызывало у меня проблем (мне не нужно было использовать выравнивание по центру до сих пор), конкретные ограничения по размерам для макета и использование выравнивания абзацев «рядом» — вот что решило мою проблему.
Других решений пока нет …