【发布时间】:2015-04-06 15:08:40
【问题描述】:
我曾尝试在 C# 上使用 RichTextBox,但发现它太慢,无法处理数千行长的文本。经过一番谷歌搜索,我发现这是因为 .net 默认使用 RichEdit 2.0,而解决方案是改用 RichEdit 5.0。
C# RichEditBox has extremely slow performance (4 minutes loading) SOLVED
效果很好,文本显示在几秒钟而不是几分钟。然而,作为一个不关心个人项目兼容性的人,我想找到更高版本的 RichEdit。我发现最新版本是 8.0,全部作为riched20.dll 发布,部分在 msftedit.dll 中。
http://blogs.msdn.com/b/murrays/archive/2006/10/14/richedit-versions.aspx
http://blogs.msdn.com/b/murrays/archive/2012/03/03/richedit-8-0-preview.aspx
但是,msdn 的文档在 4.1 中停止,(我假设是)该项目的开发人员声称他们不再在上面的博客中做公共文档。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787873(v=vs.85).aspx
到目前为止,我已经能够显式地运行 msftedit.dll 的 RichEdit 2.0 和 5.0,但所有其他版本都让我望而却步。例如,尽管 John Crenshaw 声称 RichEdit 6.0 工作正常,但我无法使用它。除了上面提到的 msftedit-2.0 和 5.0 组合之外的任何尝试都会在 Application.Run() 处导致“窗口类名称无效”错误。 (该程序是用 C# 编写的,但我没有标记它,因为我担心这个问题可能不是 C# 特定的问题。)代码是第一个链接中解决方案的几乎完全相同的副本,如下所示:
class Textbox : RichTextBox
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern IntPtr LoadLibraryW(string s_File);
public static IntPtr LoadLibrary(string s_File)
{
IntPtr h_Module = LoadLibraryW(s_File);
if (h_Module != IntPtr.Zero)
return h_Module;
int s32_Error = Marshal.GetLastWin32Error();
throw new Exception("LoadLibrary Failed with: "+s32_Error);
}
protected override CreateParams CreateParams
{
get
{
CreateParams i_Params = base.CreateParams;
try
{
// Available since XP SP1
LoadLibrary("MsftEdit.dll"); // throws
i_Params.ClassName = "RichEdit50W";
}
catch
{
// Windows XP without any Service Pack.
}
return i_Params;
}
}
我所做的是将 ClassName 字符串更改为不同的数字,例如RichEdit60W。
我在 Windows 8.1 上,所以 msftedit.dll 应该有 RichEdit 7.0 或 8.0(博客文章中给出的措辞不清楚),但我无法联系到它们。有什么办法可以纠正这个问题,或者新版本是否保密?
【问题讨论】:
标签: .net richtextbox richedit