2016-11-15 22 views
0

動作していないが、次のテストコード与えられる:コール:: 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); 

標的 - > 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がこのブラシを使ってウィンドウに正常に描画しているので、これは問題ではないことは分かっています。
  • ID2D1TextLayoutオブジェクトのGetMetricsメソッドを呼び出すと、有効なメトリックが返されます。つまり、オブジェクトに格納されているテキストの幅と高さが0または負ではありません。
  • ID2D1RenderTarget :: EndDraw()の呼び出しでエラーコードが返されない場合は、S_OKの成功コードが返されます。
  • 私のコードの別のセクション(他のdllファイルにあることがあります)では、DrawTextLayoutの呼び出しはです。があります。このコードは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だったので、指定された原点に関係なく、テキストは常にx軸とy軸の両方でFLT_MAX/2ピクセル離れているため、画面のどこにでも表示されません行き方。

テキスト形式の段落の配置をDWRITE_PARAGRAPH_ALIGNMENT_CENTERからDWRITE_PARAGRAPH_ALIGNMENT_NEARに変更することは、この問題を解決するための第一歩でした。しかし、私はまだテキストが表示されていないことに気づいた。私は、DWRITE_TEXT_ALIGNMENT_CENTERがFLT_MAX幅でも動作しないことに気づきました。同じ理由で、段落の配置が期待通りに動作していなかったからです。描画するFLT_MAXの幅がある場合は、テキストを中央に配置し、もう一度、テキストを画面の右側に配置します。

FLT_MAXを使用していても今まで私に問題を与えていませんでしたが(私は今までのセンタリングアライメントを使用する必要はなかったはずです)、レイアウトに特定のサイジング制約を与え、私の問題を解決しました。