Winforms:RichTextBox显示特殊字符的问题

一、 问题描述

RichTextBox中输入某些语言的特殊字符时,有些特殊字符将不能正确显示。

二、 问题重现

1. Visual Studio中创建一个Winforms工程;

2. 从工具箱里拖拽一个RichTextBox放到Form1上;

3. 运行该项目;

4. 把输入法设置为微软拼音的GB码输入法;

5. 在文本框中输入三个字符:81 34 D6 39/ 81 32 F2 36 /81 34 D9 31。此时文本框显示为:

在RichTextBox中输入三个字符,显示正常

6. 在文本框中输入第四个字符:81 31 8C 39。此时文本框显示为:

输入第四个字符,不能正常显示

三、 问题分析

WinformsRichTextBox是基于WindowsRiched20.dll2.0版的文本框(Rich Edit Box)。这一版本的文本框有个已知的问题,就是在显示某些语言的特殊字符时会有问题。

四、 解决方案

Windows的开发团队为了解决上述问题,在MsftEdit.dll中实现了新版本的文本框(Rich Edit Box)。遗憾的是,Winforms开发团队到目前为止还没有支持该版本文本框的计划。Winforms开发者如果遇到前面的问题,可以通过重写CreateParams使用新版本的文本框。下面是一段示范代码:

public class NewRichTextBox : RichTextBox

{

const string DLL_RICHEDIT = "msftedit.dll";

const string WC_RICHEDITW = "RICHEDIT50W";

private IntPtr moduleHandle;

private bool attemptedLoad;

[DllImport("Kernel32.dll")]

internal static extern IntPtr LoadLibrary(string libname);

public NewRichTextBox()

{

// This is where we store the riched library.

moduleHandle = IntPtr.Zero;

attemptedLoad = false;

}

protected override CreateParams CreateParams

{

get

{

CreateParams cp = base.CreateParams;

AttemptToLoadNewRichEdit();

if (moduleHandle != IntPtr.Zero)

{

cp.ClassName = WC_RICHEDITW;

}

return cp;

}

}

void AttemptToLoadNewRichEdit()

{

// Check for library

if (false == attemptedLoad)

{

attemptedLoad = true;

string strFile = Path.Combine(Environment.SystemDirectory, DLL_RICHEDIT);

moduleHandle = LoadLibrary(strFile);

}

}

}

用上述代码实现的文本框替换WinformsRichTextBox,重新编译运行程序。在新文本框中输入前面的四个字符,此时它们能正确地显示,如下图所示:

在新RichTextBox中输入四个字符,显示正常

五、 附录

GB码输入法是微软拼音输入法的一种辅助输入法。下面截图是启用该输入法的方法:

GB代码输入法

你可能感兴趣的:(windows)