1

ClearType レンダリングの利点を得るために、Graphics.DrawString呼び出し (.NET1) を(.NET 2.0 の新機能)に移行しようとしています。TextRenderer.DrawText

問題は、TextRenderer が西洋文字 (韓国語、日本語など) を正しく出力しないことです。

この問題を示す例を次に示します。

ここに画像の説明を入力

  • TextRenderer.DrawText を使用すると韓国語の文字が表示されない理由を知っていますか?
  • この問題を解決する方法を知っていますか?

次の 2 つの方法を使用して文字列を描画しています。

    private void DrawGraphicsString(
        Graphics g, string text, Font font, Point p)
    {
        g.DrawString(
            text, font, text_brush, p.X, p.Y, mStringFormat);
        // mStringFormat is
        // StringFormat.GenericTypographic | 
        // StringFormatFlags.MeasureTrailingSpaces

    }

    private void DrawTextRendererString(
         Graphics g, string text, Font font, int x, int y)        
    {
        TextRenderer.DrawText(
            g, text, font, p, this.ForeColor, this.BackColor, mTextFormatFlags);

        // mTextFormatFlags are
        // StringFormat.GenericTypographic + StringFormatFlags.MeasureTrailingSpaces
        // mTextFormatFlags = 
        //    TextFormatFlags.NoPrefix |
        //    TextFormatFlags.NoPadding |
        //    TextFormatFlags.WordBreak |
        //    TextFormatFlags.TextBoxControl |
        //    TextFormatFlags.NoClipping |
        //    TextFormatFlags.ExpandTabs;
    }

EDIT:他のフォントを使用すると正しく動作します(フォントMalgun Gothicを使用)

ここに画像の説明を入力

だから今私の質問は:

  • フォントが韓国語の文字をサポートしていなくても、Graphics.Drawtext が韓国語の文字を描画するのはなぜですか?
  • 「Consolas」フォントを使用する Visual Studio エディターにコリアン テキストを貼り付けたところ、正しく描画されました。では、なぜ Visual Studio エディターでは韓国語の文字を表示でき、テキスト ボックスでは表示できないのでしょうか?
4

1 に答える 1

1

実際のところ、エディターは、既知の Unicode 範囲からサポートされていない文字がある場合、デフォルトの Unicode フォントのフォントを変更します (あなたの場合、おそらく Arial Unicode Sans MS または MS-Mincho を必要とする CJK Unicode 定義)。一方、特定のフォントを使用した強制レンダリングでは、このフォント切り替えは許可されません。

そのため、Unicode が必要かどうか、およびこの場合にどのフォントを使用する必要があるかを、コンパイルする前に知っておく必要があります。

したがって、他の質問については、DrawText ができなかったのに、DrawString がフォントの切り替えに成功した理由を教えてください。秘密は、設定した StringFormat.GenericTypographic フラグにあります。GenericTypographics のデフォルトには、中間言語に設定された言語 ID が含まれています。

これは、呼び出しスレッドに関連付けられている現在の言語が使用されることを意味します。[1]

CJK 入力文字列を使用しているため、おそらく呼び出しスレッドは CJK 言語セットに設定された言語を認識しており、一般的な Unicode フォント スイッチを使用してディスプレイに正しい記号が表示されるようにします。

于 2013-05-08T17:47:12.863 に答える