RichTextBox无法显示Unicode数学字母数字符号。

12

我无法让WinForms的RichTextBox显示一些Unicode字符,特别是数学字母符号(但问题很可能不仅限于这些字符)。

令人惊讶的是,相同的字符可以在普通或多行TextBox中使用相同(默认)字体显示。即使我将字体更改为例如"Arial"或"Lucida",也会得到相同的结果。

TextBox vs. RichTextBox

屏幕截图来自Windows 10,但我在Windows 7上也得到了相同的结果。该示例显示了ASCII小写字母a-d后跟数学斜体无衬线小写字母alpha-delta

我正在使用Visual Studio 2017和.NET 4.6.1。

下面是一个简单的测试代码:

private void InitializeComponent()
{
    this.textBox1 = new System.Windows.Forms.TextBox();
    this.richTextBox1 = new System.Windows.Forms.RichTextBox();
    // ...
    this.SuspendLayout();
    // 
    // textBox1
    // 
    this.textBox1.Location = new System.Drawing.Point(25, 38);
    this.textBox1.Multiline = true;
    this.textBox1.Name = "textBox1";
    this.textBox1.Size = new System.Drawing.Size(182, 108);
    this.textBox1.TabIndex = 0;
    this.textBox1.Text = "abcd ";
    // 
    // richTextBox1
    // 
    this.richTextBox1.Location = new System.Drawing.Point(213, 38);
    this.richTextBox1.Name = "richTextBox1";
    this.richTextBox1.Size = new System.Drawing.Size(179, 108);
    this.richTextBox1.TabIndex = 1;
    this.richTextBox1.Text = "abcd ";
    // ...
}
请注意,似乎不是存储字符的问题。这些字符已正确存储在 RichTextBox 中。如果将文本复制并粘贴到其他地方(例如 TextBox),所有字符都会正确显示。
另一方面,如果将这些字符粘贴到 RichTextBox 中,则会出现相同的不正确显示。
因此,看起来只是一个显示问题。
1个回答

14

RichTextBox 中存在一个已被修复的 bug/设计决策问题,该问题在 .NET 4.7 版本中得到了解决。

RichTextBox 实际上是 RichEdit 的包装器。在 .NET 4.7 中,控件使用 RICHEDIT50W,而在早期版本中则使用 RichEdit20W

解决该问题的方法有两种:

  • 升级到 .NET 4.7

或者

  • 使用最新版本的 RichTextBox,即 RICHEDIT50W,为此,您应该从标准的 RichTextBox 继承并重写 CreateParams 并加载库 Msftedit.dll,然后将 ClassName 设置为 RICHEDIT50W

要查看实现,请参阅此帖子


1
我改成了4.7,现在运行良好。非常感谢@Reza Aghaei。 - Rejwanul Reja
2
它仍然在4.8版本中发生。 - Jaroslav Daníček
@JadaVonRuth 我最近没有尝试过,但我检查了 RichTextBox源代码,我期望它能正常工作。请确保您在 AppContextSwitchOverrides 中没有打开 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl - Reza Aghaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接