В принципе, учитывая следующий код испытания:призывает к 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, рисует его, а затем уничтожает объект. Это много ненужной работы, которую можно облегчить, используя сам объект макета текста.
Кто-нибудь может понять, почему это может произойти? Я совершенно не понимаю, почему это происходит, хотя я буду продолжать пытаться найти связь где-то.