Direct2D/DirectWrite でテキストをレンダリングしていますがSetLineSpacing()
、TextFormat または TextLayout を呼び出しても効果がないようです。誰かが理由を知っていますか?
6 に答える
これはバグだと99%確信しています。最近、Direct2Dを少しいじってみましたがSetLineSpacing()
、TextLayoutでも問題がありました。これは、あなたが説明しているものと同じだと思います。その場合、それはあなただけではないことを確認できます。MSConnectでバグレポートを再度開きます。閉じられました。
残念ながら、何をしようとしているのかを示すコードを提供していません。次のように行間隔を設定しようとしていると仮定しています。
pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);
MSDN のドキュメントは、さまざまな行間方法についてあまり明確ではありません。デフォルトの方法では、各行の間隔は、使用されているフォントとインライン オブジェクト (存在する場合) から導出されるため、各行はその内容に応じて必要な高さになります。この場合、2 つのパラメーターlineSpacing
とbaseline
は無視されます。
単一のフォント (およびフォント サイズ) を使用し、インライン オブジェクト (またはテキストよりも高くないインライン オブジェクト) を使用しないテキスト形式の場合は、均一な行間隔を指定できます。これがDWRITE_LINE_SPACING_METHOD_UNIFORM
目的です。試してみたところ、SetLineSpacing()
このメソッドで呼び出すと、渡された引数に従って行間隔が均一になります。
Windows 10 以降ではDWRITE_LINE_SPACING_METHOD_PROPORTIONAL
、フォント サイズとインライン オブジェクトが指定するものに相対的な行間隔を実現するために使用できる 3 番目の行間隔方法があります。ただし、これは Windows 10 でのみサポートされています。
私の経験では、最も誤解を招く部分は、呼び出しSetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y)
がエラーなしで成功し、後でメソッドを使用して行間パラメーターを取得すると、GetLineSpacing()
提供された値が返されることです (まだ何も達成されていません)。この点に関して、API は内部的に一貫しており、指定された値が役に立たなくても破棄しません。GetLineSpacing()
また、新しく作成されたIDWriteTextFormat
またはインスタンスを呼び出すとIDWriteTextLayout
、値はゼロとして返されます (行間メソッドが であるため、これは正しいですDWRITE_LINE_SPACING_METHOD_DEFAULT
)。便利なことを行うには、使用しているフォントのデフォルトの行間隔を決定する必要があります。IDWriteFont::GetMetrics()
これは、使用しているフォントを呼び出すことで実現できます。デフォルトの行間は、 の合計ですascent
。descent
とlineGap
値。
Charles Petzold は、 DirectWrite を使用したページネーションに関する記事でこれについて書いています。
私はドミトリ・ネステルクが言ったのと同じ問題を抱えています。
ただし、「CreateTextLayout の後」に lineSpacing を設定すると、SetLineSpacing が機能しないことがわかりました。
それ以外の場合は、CreateTextLayout の前に LineSpacing を設定すると、すぐに機能します。
たぶん、このソリューションを試すことができます。
PS: 私の環境。Window Vista SP2 です。
どうもありがとう。
私は何かが足りないのですか?
IDWriteTextFormatもIDWriteTextLayoutもSetLineHeight関数を持っていません...
HRESULT
によって返されるエラーコードを確認しましたSetLineSpacing()
か?
ヒント:Visual Studioを使用している場合eax,hr
は、デバッグウォッチウィンドウの1つを入力するだけで、呼び出しの直後に発生する可能性のあるエラーコードを確認できます。
サポートされる最小限のクライアント: Windows 7、SP2 を適用した Windows Vista、および Windows Vista のプラットフォーム アップデート。
上記のバージョンの Windows を実行していますか? 変更が表示されない理由は、上記の状態よりも下のバージョンが DirectWrite の SetLineSpacing() をサポートしていないためだと思います。