基本的に、次のテストコードが与えられます:
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 です。
- DrawTextW メソッドを使用して適切にテキストを描画できるため、TextFormat は有効な IDWriteTextFormat オブジェクトです。
- CreateTextLayout の呼び出しはエラー コードを返さず、S_OK 成功コードを返します。
- TextFormat とテキスト レイアウト オブジェクトは両方とも、同じ DirectWrite ファクトリを使用して作成されました。これは、アプリケーションに存在する唯一の DirectWrite ファクトリでもあります。
- ID2D1SolidColorBrush textBrush は、不透明度 1.0 の有効なブラシで、色が黒に設定されています。DrawTextW はこのブラシを使用してウィンドウに正常に描画しているため、これが問題ではないことはわかっています。
- ID2D1TextLayout オブジェクトの GetMetrics メソッドを呼び出すと、有効なメトリックが返されます。つまり、オブジェクトに格納されているテキストの幅と高さは 0 または負ではありません。
- ID2D1RenderTarget::EndDraw() の呼び出しは、エラー コードを返さず、S_OK 成功コードを返します。
- 私のコードの別のセクション (たまたま別の dll ファイルにある) で最も困惑しているのは、DrawTextLayout の呼び出しが機能することです。このコードは dll ファイルにありますが、同じ DirectWrite ファクトリを使用しています。別のdllファイルにいることが違いを生むとは本当に思いません。
私が提供した両方のコード サンプルは、次々に実行され、両方ともテキストを正常に描画するはずです。ただし、テキストを描画しているのは DrawTextW だけです。Direct 2D Effects を使用するなど、描画に関して複雑なことは何もしていません。コードは、私が提供したサンプルほど複雑ではありません。今のところ、DrawTextW メソッドを使用できますが、単純に IDWriteTextLayout オブジェクトを作成して描画し、オブジェクトを破棄する方法をどこかで読んだので、使用したくありません。これは多くの不要な作業ですが、テキスト レイアウト オブジェクトを自分で使用することで軽減できます。
なぜこれが起こっているのか誰にも分かりますか?なぜこれが起こっているのか、私にはまったくわかりませんが、どこかで接続を見つけようとし続けます.