Graphics.DrawString vs TextRenderer.DrawText рисование корейских символов - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь перенести мои Graphics.DrawString вызовы (.NET1) на TextRenderer.DrawText (новое в .NET 2.0), чтобы получить преимущества рендеринга ClearType.

Проблема в том, что TextRenderer не печатает правильно символы западного алфавита (корейский, японский и т. Д.)

Вот пример, показывающий проблему:

enter image description here

  • Знаете ли вы, почему корейские символы не видны при использовании TextRenderer.DrawText?
  • Знаете ли вы, как решить эту проблему?

Я рисую строки, используя следующие два метода:

    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;
    }

РЕДАКТИРОВАТЬ: Использование другого шрифта работает правильно (используется шрифт Malgun Gothic)

enter image description here

Так что теперь мои вопросы:

  • Почему Graphics.Drawtext рисует корейские символы, даже если шрифт их не поддерживает?
  • Я вставил текст corean в редактор Visual Studio, который использует шрифт «Consolas», и он нарисован правильно. Итак, почему редактор Visual Studio может отображать корейские символы, а текстовое поле - нет?

1 Ответ

1 голос
/ 08 мая 2013

Дело в том, что редакторы меняют шрифт на свой шрифт Unicode по умолчанию, имея неподдерживаемые символы из известного им диапазона Unicode (в вашем случае это определение CJK Unicode, которое, вероятно, требует Arial Unicode Sans MS или MS-Mincho).Между тем, принудительный рендеринг с определенным шрифтом не позволяет этот переключатель шрифтов.

Вот почему вы должны знать перед компиляцией, нужен ли вам Unicode и какой шрифт вы хотите использовать в этом случае.

Итак, для вашего другого вопроса, почему DrawString удалось сделать переключение шрифтов, в то время как DrawText не смог.Секрет в вашем установленном флаге StringFormat.GenericTypographic.GenericTypographics по умолчанию содержит идентификатор языка, установленный на нейтральный язык,

, что означает использование текущего языка, связанного с вызывающим потоком. [1]

Поскольку вы используете входную строку CJK, вероятно, ваш вызывающий поток знает язык, установленный для набора языков CJK, а затем убедитесь, что на дисплее отображается правильныйсимволы, имеющие общий переключатель шрифта Unicode.

...