2016-11-15 5 views
0

В принципе, учитывая следующий код испытания:призывает к 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 объект, и цель является допустимым ID2D1HwndRenderTarget.
  • TextFormat - это действительный объект IDWriteTextFormat, так как я могу правильно рисовать текст с помощью метода DrawTextW.
  • Вызов CreateTextLayout не возвращает код ошибки, он возвращает код успеха S_OK.
  • TextFormat и объект макета текста были созданы с использованием той же фабрики DirectWrite, которая также является единственной фабрикой DirectWrite, существующей в моем приложении.
  • ID2D1SolidColorBrush textBrush - это действительная кисть с прозрачностью 1.0 и установка цвета черного цвета. Я знаю, что это не проблема, потому что DrawTextW использует эту кисть для успешного рисования в окне.
  • Вызов метода GetMetrics объекта ID2D1TextLayout возвращает действительные показатели; другими словами, ширина и высота текста, хранящегося в объекте, не равна 0 или отрицательна.
  • Вызов ID2D1RenderTarget :: EndDraw() не возвращает код ошибки, он возвращает код успеха S_OK.
  • В большинстве случаев, в другом разделе моего кода (который находится в другом dll-файле), вызовы DrawTextLayout do работают. Несмотря на то, что этот код находится в DLL-файле, он использует тот же DirectWrite Factory. Я действительно не думал бы, что быть в другом dll-файле должно иметь значение.

Оба экземпляра кода, которые я предоставил, выполняются один за другим, и оба должны сделать текст успешно. Однако только DrawTextW рисует текст. Я не делаю ничего сложного с рисованием, например, с помощью Direct 2D Effects. Код не сложнее, чем образцы, которые я предоставил. На данный момент я могу просто использовать метод 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 до сих пор не давало мне проблем (до сих пор мне не приходилось использовать центрирующие выравнивания), давая конкретные ограничения размеров для макета и используя выравнивание абзаца «Near», это то, что решил мою проблему.

Смежные вопросы