我在C#上尝试过使用C#,发现它太慢了,无法处理数千行长的文本。在googling搜索之后,我发现这是因为.net默认使用RichEdit 2.0,而解决方案是使用RichEdit 5.0。
它运行良好,文本以秒而不是分钟为单位显示。然而,作为一种不关心个人项目兼容性的人,我想找到更晚版本的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,但所有其他版本都无法实现。例如,尽管的评论声称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。
我在Windows8.1上,所以msftedit.dll应该有多达RichEdit 7.0或8.0 (博客文章中给出的措辞不清楚),但我无法联系到他们。是否有任何方法来纠正这一点,或较新版本的confidencial?
发布于 2015-04-07 09:48:45
我的机器上有RichEdit版本8.0,类名为RICHEDIT60W。它存储在C:\Program (x86)\Common \Microsoft\Office15\RICHED20.DLL中。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.ComponentModel;
class RichEdit80 : RichTextBox {
protected override CreateParams CreateParams {
get {
if (moduleHandle == IntPtr.Zero) {
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFilesX86);
path = System.IO.Path.Combine(path, @"Microsoft Shared\OFFICE15\RICHED20.DLL");
moduleHandle = LoadLibrary(path);
if ((long)moduleHandle < 0x20) throw new Win32Exception(Marshal.GetLastWin32Error(), "RichEdit control appears to be missing");
}
CreateParams createParams = base.CreateParams;
createParams.ClassName = "RichEdit60W";
if (this.Multiline) {
if (((this.ScrollBars & RichTextBoxScrollBars.Horizontal) != RichTextBoxScrollBars.None) && !base.WordWrap) {
createParams.Style |= 0x100000;
if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x2000;
}
}
if ((this.ScrollBars & RichTextBoxScrollBars.Vertical) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x200000;
if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x2000;
}
}
}
if ((BorderStyle.FixedSingle == base.BorderStyle) && ((createParams.Style & 0x800000) != 0)) {
createParams.Style &= -8388609;
createParams.ExStyle |= 0x200;
}
return createParams;
}
}
private static IntPtr moduleHandle;
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern IntPtr LoadLibrary(string lpFileName);
}没有经过彻底的测试。希望您对这段代码感到非常不舒服,它只适合于测试目的,以确定您是否领先。DLL的路径当然是“大红旗”,当您的计算机上没有Office 2013时,您将不得不更改它。要求用户在其机器上安装正确的Office版本,只有当您对程序将要运行的计算机有良好的控制时,才能正常工作。在LoadLibrary()失败时使用回退路径在技术上是可能的。
这个特定的版本所做的事情以及它如何与工具箱中的默认RichTextBox不兼容是很难进行反向工程的。粗略的猜测是“更符合单词”。例如,后来的RichEdit版本更好地支持数学方程。只有通过彻底的测试才能找到答案。最好坚持使用msftedit.dll
发布于 2015-04-07 07:48:52
RichEdit似乎主要是作为Office1.0、2.0、3.0和4.1版本的一部分在微软开发的,在不同的时候只包括1.0、2.0、3.0和4.1版本。
其他的更高版本的RichEdit可以在Microsoft安装中找到:如果安装了LoadLibrary(),就必须在"Program“下显式地从它们的位置找到它们。如果未安装Office,则运气不佳:这些其他版本不存在于裸Windows中,也没有重新分配许可证允许您以任何适当的方式发布它们。
所以基本上你运气不好。抱歉的。
https://stackoverflow.com/questions/29473940
复制相似问题