2017-01-04 15 views
1

私はDrawingContext DrawGlyphRun(GlyphRun)関数を使用して、https://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/のソリューションを使用してキャンバスにテキストを描画しています。WPF DrawingContext DrawGlyphRunぼかしテキスト

これはFormattedTextよりも高速ですし、テキストの幅を計算するためにも使用されています。

これは、ウェル2つの問題を除いて動作します:

  1. テキストがぼやけている(画像の下を参照)。上部のテキストは、GlyphRunを使用して表示されます。下のテキストは、より良い品質を持つFormattedTextを使用して表示されます。

Blur Image

<オール開始= "2">
  • は、日本語または中国語の文字を表示することができません。
  • 文字の問題は、GlyphTypeface.CharacterToGlyphMapがjpまたはcn文字を見つけることができないため、これらの文字をどのように処理するかがわかりません。

    答えて

    1

    私が行ったいくつかの調査の結果、あなたの質問が見つかりました。

    GlyphRunがpublicコンストラクタを使用して作成し、パラメータとしてTextFormattingModeを受け入れ、そのrendringの使用方法/コンストラクタのためcontols TextFormattingMode = Ideal

    すべてWPFでオブジェクトを作成します。

    あなたはリフレクション経由GlyphRun.TryCreate()静的メソッドを呼び出すことができます。

    internal static GlyphRun TryCreate(
         GlyphTypeface   glyphTypeface, 
         int      bidiLevel, 
         bool     isSideways, 
         double     renderingEmSize, 
         IList<ushort>   glyphIndices, 
         Point     baselineOrigin, 
         IList<double>   advanceWidths, 
         IList<Point>   glyphOffsets, 
         IList<char>    characters, 
         string     deviceFontName, 
         IList<ushort>   clusterMap, 
         IList<bool>    caretStops, 
         XmlLanguage    language, 
         TextFormattingMode  textLayout 
         ) 
    

    いますが、TextFormattingMode = IdealadvanceWidthsを取得する必要があり、問題を。このためには、GlyphTypefaceクラスが提供する内部メソッドへのリフレクションを介してアクセスする必要があります。あなたはtextFormattingMode = TextFormattingMode.Ideal

    とインデックスで辞書にアクセスするあなたは、.NETソースコードをダウンロードし、それを自分でチェックすることができたときにこれらの幅で辞書を返し

    GlyphTypeface.AdvanceWidthsプロパティは、内部

    internal double GetAdvanceWidth(ushort glyph, TextFormattingMode textFormattingMode, bool isSideways) 
    

    に呼び出します。

    2番目の質問では、グリフインデックスを取得するためにユニコードコードポイントの代わりにcharを使用すると思います。

    関連する問題