一、 问题描述
在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码输入法是微软拼音输入法的一种辅助输入法。下面截图是启用该输入法的方法:
分享到:
相关推荐
在C#的WinForms中嵌入WPF显示3D图形并导出为STL格式: 1.创建项目: 在Visual Studio中创建一个新的WinForms项目。 2.添加WPF支持: 向解决方案中添加一个新的WPF用户控件库项目。 3.WPF控件嵌入WinForms: 使用...
验证.WinForms 扩展以允许验证WinForms UI。 可通过获得支持。 内容 NuGet包 用法 在程序集加载时一次启用VerifyXaml: VerifyWinForms . Enable (); | 形成 可视元素(窗体/控件等)可以按以下方式进行验证: ...
webview-winforms 由和提供支持的 Winforms 中的 Webview
Windows窗体(WinForms)是用于构建Windows桌面应用程序的UI框架。 它是Windows用户界面库(例如User32和GDI +)上的.NET包装。 它还提供Windows窗体特有的控件和其他功能。 Windows窗体还提供了基于Visual Studio...
VS13.WinForms概述使用Visual Studio 2013进行WinForms开发的开发组件和设计机制。 项目VS13.Reminders.Lib,VS13.Reminders.Win为WinForms应用程序提供Outlook样式的项目提醒。 通知区域中的VS13.TrayIcon.Lib,...
定积分程序 该程序使用多种方法计算定积分: 梯形法 左矩形法 直角矩形法 中矩形的方法 它还显示2个积分的公共区域,并可以选择颜色,阶跃等。
C#计时器 WinForms QQ:292258449
Unity Windows表单 在“ UnityEngine.GUI”类的顶部构建的Unity3d的Windows窗体端口(包括System.Drawing)。 支持的控件 按钮; 复选框; 组合框; DateTimePicker; FontDialog; 形成; GroupBox;...
.NET Windows窗体示例的GroupDocs.Viewer 版本1.0.0 系统要求 .NET Framework 4.6.1 Visual Studio 2019 ... API的允许您查看90多种文档格式,包括DOCX , PDF , PPT , XLS等,而无需任何其他依赖项。...
Microsoft 帐户 Windows 窗体该库提供了一种从 Windows 窗体应用程序生成 Microsoft 帐户访问和刷新令牌的简单方法。... 您的应用程序需要在 API 设置页面上配置为移动或桌面客户端应用程序,此库才能工作。...
WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法
CNPJ咨询-API ReceitaWS :office_building: Projeto副顾问CNPJ实用程序Windows窗体+ API ReceitaWS + SQL Server 基础做项目: : API的实用程序 ...观察API: 否,不存在3个请求,并保留所有权利;...
mvp-winforms 清晰的体系结构,使用EF Code First项目将MVP模式实现到Windows窗体应用程序
RichTextBox 练习,保存和读取图片数据库 QQ:292258449
这是一个使用Windows-Forms Application作为工具的.NET Framework上的简单簿册系统
ComponentOne Studio for WinForms is a comprehensive suite of controls and components for developing .NET WinForms solutions. It includes the following ComponentOne WinForms products: - BarCode for...
Q691926问题的回答,C# winforms登录+权限 Q691926问题的回答,C# winforms登录+权限
附件:WeifenLuo.WinFormsUI.Docking3.1.0.rar 包含: WeifenLuo.WinFormsUI.Docking.dll, license.txt ,WeifenLuo.WinFormsUI.Docking.pdb 等三个文件。基于Net4.0; 布局控件"WeifenLuo.WinFormsUI.Docking"是一个...
需要在DockPanel控件中显示的子窗体(多标签,停靠,自动隐藏)必须继承自WeifenLuo.WinFormsUI.Docking. DockContent类;DockContent重载了窗体的show方法,所以继承自DockContent的子窗体能把自己以指定方式显示在...
Timer 控件使用,ListView 控件,TreeView 控件