Winforms:RichTextBox显示特殊字符的问题
2010-01-17 16:39
274 查看
一、 问题描述
在RichTextBox中输入某些语言的特殊字符时,有些特殊字符将不能正确显示。
二、 问题重现
1. 在Visual Studio中创建一个Winforms工程;
2. 从工具箱里拖拽一个RichTextBox放到Form1上;
3. 运行该项目;
4. 把输入法设置为微软拼音的GB码输入法;
5. 在文本框中输入三个字符:81 34 D6 39 / 81 32 F2 36 /81 34 D9 31。此时文本框显示为:
6. 在文本框中输入第四个字符:81 31 8C 39。此时文本框显示为:
三、 问题分析
Winforms的RichTextBox是基于Windows的Riched20.dll中2.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);
}
}
}
用上述代码实现的文本框替换Winforms的RichTextBox,重新编译运行程序。在新文本框中输入前面的四个字符,此时它们能正确地显示,如下图所示:
五、 附录
GB码输入法是微软拼音输入法的一种辅助输入法。下面截图是启用该输入法的方法:
在RichTextBox中输入某些语言的特殊字符时,有些特殊字符将不能正确显示。
二、 问题重现
1. 在Visual Studio中创建一个Winforms工程;
2. 从工具箱里拖拽一个RichTextBox放到Form1上;
3. 运行该项目;
4. 把输入法设置为微软拼音的GB码输入法;
5. 在文本框中输入三个字符:81 34 D6 39 / 81 32 F2 36 /81 34 D9 31。此时文本框显示为:
6. 在文本框中输入第四个字符:81 31 8C 39。此时文本框显示为:
三、 问题分析
Winforms的RichTextBox是基于Windows的Riched20.dll中2.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);
}
}
}
用上述代码实现的文本框替换Winforms的RichTextBox,重新编译运行程序。在新文本框中输入前面的四个字符,此时它们能正确地显示,如下图所示:
五、 附录
GB码输入法是微软拼音输入法的一种辅助输入法。下面截图是启用该输入法的方法:
相关文章推荐
- Ext显示特殊字符问题
- 2015第23周四HTML特殊字符显示问题
- TextField htmlText 以及xml里"<" 和 ">" 等特殊字符的显示问题
- 特殊字符显示问题
- jQuery在异步请求数据返回后,调用$("selector").html(data.content);之后因为一些特殊字符或者',"不能显示内容的问题解决办法
- iPhone代码碎片:处理objective-c里html特殊字符显示问题的一个函数
- HTML特殊字符后台保存与前台显示问题
- UTF-8编码的特殊字符,在GBK下显示?的问题
- 特殊字符不能显示的问题
- 数据库文本中关于换行和回车等特殊字符的输出显示问题
- HT中特殊字符φ的显示问题
- HT中特殊字符φ的显示问题
- 【原】解决PS1的显示问题,busybox的/u /h特殊字符解析问题
- LED点阵显示,有关特殊国别(阿拉伯,希伯来,泰文)字符排版和乱码问题解决
- 【原】解决PS1的显示问题,busybox的/u /h特殊字符解析问题
- jmeter随笔(5)--断言中正则表达式的特殊字符问题和中文乱码显示问号的问题
- gdb 不能完全显示长字符问题
- URL的参数中有加号传值的问题(URL特殊字符)
- 有关导出Excel特殊字符的问题
- VC读取mysql数据库中文字符的时候全部显示问号问题的处理