1

基本的に、次のテストコードが与えられます:

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 オブジェクトを作成して描画し、オブジェクトを破棄する方法をどこかで読んだので、使用したくありません。これは多くの不要な作業ですが、テキスト レイアウト オブジェクトを自分で使用することで軽減できます。

なぜこれが起こっているのか誰にも分かりますか?なぜこれが起こっているのか、私にはまったくわかりませんが、どこかで接続を見つけようとし続けます.

4

1 に答える 1

2

私は修正を見つけたと信じています。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 だったので、指定した原点位置に関係なく、テキストは画面のどこにも表示されません。これは、x 方向と y 方向の両方で常に約 FLT_MAX / 2 ピクセル離れているためです。

テキスト形式の段落配置を DWRITE_PARAGRAPH_ALIGNMENT_CENTER から DWRITE_PARAGRAPH_ALIGNMENT_NEAR に変更することが、問題を解決するための最初のステップでした。ただし、テキストがまだ表示されていないことに気付きました。DWRITE_TEXT_ALIGNMENT_CENTER が FLT_MAX 幅でも機能しないことに気付きました。同じ理由で、段落の配置が期待どおりに機能していませんでした。描画する FLT_MAX 幅がある場合にテキストを中央に配置すると、テキストが画面から右にずれます。

したがって、これまで FLT_MAX を使用しても問題は発生しませんでしたが (今まで中央揃えを使用する必要はなかったはずです)、レイアウトに特定のサイズ制限を与え、「近い」段落配置を使用することで問題が解決しました。

于 2016-12-25T08:26:48.930 に答える