您的位置:首页 > 其它

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码输入法是微软拼音输入法的一种辅助输入法。下面截图是启用该输入法的方法:
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息