我正在尝试将Graphics.DrawString
调用(.NET1)迁移到TextRenderer.DrawText
(.NET 2.0中的新增功能),以获得ClearType渲染的优势。
问题是TextRenderer不能正确打印西方字符(韩国,日本等......)
以下是一个显示问题的示例:
我正在使用以下两种方法绘制字符串:
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)
所以现在我的问题是:
答案 0 :(得分:1)
事实上,当编辑器在他们知道的Unicode范围内具有不受支持的字符时(在您的情况下,可能需要Arial Unicode Sans MS或MS-Mincho的CJK Unicode定义),编辑器会更改其默认Unicode字体的字体。同时,使用某种字体强制渲染不允许这种字体切换。
这就是为什么你必须在编译之前知道你是否需要Unicode以及在这种情况下你想使用哪种字体。
所以对于你的另一个问题,为什么DrawString成功进行字体切换而DrawText无法做到。秘密在你设置的StringFormat.GenericTypographic标志中。 GenericTypographics默认包含设置为中性语言的语言ID,
表示使用与调用线程关联的当前语言。 [1]
由于您使用的是CJK输入字符串,因此您的调用线程可能知道设置为CJK语言集的语言,然后通过使用它的通用unicode字体开关来确保显示器显示正确的符号。