2017-12-07 36 views
1

私はいくつかのフォントが選択されたデバイスコンテキストを持っています。ID2D1RenderTargetDrawTextにしたいと思います。DirectWrite GDI interop: `IDWriteFontFace`を使ってテキストを描く簡単な方法

現在、私はこれをacchieveするには、以下のルートを行く:

  • CreateFontFaceFromHdc経由IDWriteFontFaceを取得します。
  • IDWriteFontFaceからIDWriteFontを取得してください(これはGetSystemFontCollection経由で取得します - 次の手順を参照)。
  • IDWriteFontで指定されたパラメータを供給し、fontCollectionとしてnullptrを指定し、私は、デフォルトのシステムフォントコレクションを使用したいことを示す、CreateTextFormat介しIDWriteTextFormatを取得します。
  • IDWriteTextFormatDrawTextに渡します。

私はこのことについて奇妙な見つけることは、私はすでに最初のステップでIDWriteFontFace持っている、と明らかに「戻って」と、ちょうどDrawTextFormatにそれを渡すために、IDWriteFont用フォントの収集を依頼しなければならないことです次にDrawTextに使用することができます。これは不必要に複雑に思えます - 特にテキストを描画するために、おそらくシステムはおそらくIDWriteFontFaceに行かなければならないでしょうか?

DrawGlyphRunが見つかりました。 baselineOrigin、これはあらかじめ計算しておく必要があります(glyphRunはもちろんです)。

すでにIDWriteFontFaceがある場合、ID2D1RenderTargetにテキストを描画する簡単な方法はありませんか?

+1

実際には、選択したフォントがAddFontMemResourceEx()から来た場合にどうなるかわかりません。この場合、システムコレクションでは利用できません。 – bunglehead

答えて

1

これはあなたが説明したような唯一の方法です。テキスト形式のインスタンスを構築するために戻り、DirectWriteスタイルのレンダリングに使用します。 DrawGlyphRunは低レベルのメソッドですが、もちろん使用できますが、多くのレイアウトロジックを自分で実装する必要があります。これは避けるべきことです。一般的に、DrawTextはDirect2Dでレンダリングする最も効率的な方法ではありません。レイアウトオブジェクトを一度作成し、再描画する必要があるたびに使用することをお勧めします。

+0

ありがとう!しかし、 'IDWriteTextLayout'を生成するには、最初に' IDWriteTextFormat'が必要です。そこで 'IDWriteFontFace'を使用することはできません。 – phimuemue

+0

はい、フォーマットオブジェクトも必要です。複雑さは、あなたが最初の場所でGDI interopを使用しているという事実から来ています。 DrawTextを使用できるようにするには、ファミリ名とフォントプロパティを知る必要があります。そしてもう一度、私の他のコメントを参照してください、私はそれがメモリフォントリソースのためにどのように動作するか分からない、それも制限要因かもしれません。 – bunglehead

関連する問題