使用较新的 RichEdit 版本?

2023-11-24

我尝试过在 C# 上使用 RichTextBox,发现处理数千行长文本时速度太慢。经过一番谷歌搜索,我发现这是因为.net默认使用RichEdit 2.0,解决方案是使用RichEdit 5.0。

C# RichEditBox 性能极慢(加载 4 分钟)已解决

它工作得很好,文本在几秒钟而不是几分钟内显示。然而,作为那种不关心个人项目兼容性的人,我想找到更高版本的 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(博客文章中给出的措辞不清楚),但我无法访问它们。有什么办法可以纠正这个问题,或者新版本是否保密?


我的机器上有 RichEdit 版本 8.0,类名为 RICHEDIT60W。它存储在 C:\Program Files (x86)\Common Files\Microsoft Shared\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 不兼容是很难进行逆向工程的。粗略猜测是“与Word更兼容”。更高版本的 RichEdit例如,更好地支持数学方程。找出答案的唯一方法是彻底测试。最好坚持使用 msftedit.dll

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用较新的 RichEdit 版本? 的相关文章

  • 使用 Dojo 富文本编辑器提交表单

    有人知道如何提交包含 Dojo 富文本编辑器的表单吗 我尝试将 name 属性添加到用 dojoType dijit Editor 装饰的元素中 但是 我在接收过程中没有看到任何 HTML 我已经检查了文档 但没有看到任何明确的示例 除了将
  • 抛出并保留堆栈跟踪不符合代码分析所描述的预期

    进行代码分析给了我项目 CA2200 CA2200 重新抛出以保留堆栈详细信息 func 重新抛出捕获的异常并将其显式指定为参数 请改用不带参数的 throw 以保留最初引发异常的堆栈位置 我已经实现了该建议 但无论如何我似乎都得到了相同的
  • 时间跨度格式[重复]

    这个问题在这里已经有答案了 当您将时间跨度声明为以下形式时 如何优雅地格式化时间跨度以表示 1 小时 10 分钟 TimeSpan t new TimeSpan 0 70 0 我当然知道你可以为此做一些简单的数学计算 但我有点希望 NET
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • WPF:Prism 对于小型应用程序来说是不是太过分了?

    如果我不将我的应用程序分成不同的模块 否则我会认为 Prism 确实是可行的方法 我应该使用 Prism 吗 我知道 Prism 提供了一个方便的实现ICommand 我可以自己在一页代码中完成 并为我们提供IEventAggregator
  • 尝试对无法访问的主机进行套接字操作

    一位客户在连接到我们的服务器服务的 WCF 客户端上报告了此错误 消息 尝试对无法访问的主机进行套接字操作 类型 System Net Sockets SocketException 从这个链接http msdn microsoft com
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • DOCX 到 PDF:SaveAs2、ExportAsFixedFormat 与 PrintOut

    我有一个小小的目标 即使用 C 和 NET 将大量 docx 文件转换为 pdf 而无需打开 Word 可见 且无需使用任何第三方库 需要管理的组件更少 花费的资金也更少 目前 我正在尝试正确转换单个文档 该文档必须尽可能高效 以便快速转换
  • DateTimeOffset 到 DateTime 转换 - 数据丢失

    当我将 datetimeoffset 值转换为 datetime 值时 是否有可能丢失数据 从MSDN文档中 提到从datetimeoffset到datetime的转换如下 DateTime 属性最常用于执行 DateTimeOffset
  • ASP.NET Core 应用程序生命周期

    目前是否有关于生命周期的 ASP NET Core 文档 我希望能够在正确的点融入生命周期 它与现有的 ASP NET MVC 5 生命周期相似吗 http www asp azureedge net v 2016 09 01 001 me
  • 为什么.NET Framework 4.0安装程序的大小小于3.0/3.5?

    我看到 Net Framework 4 0的beta2安装程序只有55MB 而 Net 3 5的安装程序有200 MB 这是怎么回事 NET 3 5 之所以这么大 是因为它在同一个包中包含 x64 版本的框架 2 0 3 0 软件包针对 x
  • 在线找到具有两个不同参数的多个匹配绑定

    我在同一个功能文件中写了两行 何时 When user action1 key1 with value1 for atttributeType Value in Filename1 SectionId1 Then abc When user
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • .NET - MVC 应用程序外部的 Razor - 删除 @inherits 和提供 @model 时出现问题

    抱歉问了这么长的问题 我把它分成了三个问题 可以分别阅读 如果你能帮我解决一个问题 请帮我 我有一个 Razor 引擎的自定义实现 所有作品和模板均已编译并可以使用 手头有一些实现涉及具有通用的基类Model允许强类型视图 模板 的属性 此
  • 如何使用c#/VB.NET在word中插入书签

    我正在尝试使用 C 在 Word 文档中添加书签 但它不起作用 而且我在 msdn 文档和互联网上都找不到任何帮助 这就是我正在尝试做的事情 我正在阅读 Word 文档 然后在该文档中搜索关键字 然后将该文本转换为超链接 效果很好 现在 我
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • SolrNet:尝试添加和提交时 SolrConnectionException (400) 错误请求

    我已经到了 SolrNet 执行 Add 方法的地步 但是当我尝试 Commit 时 我收到了错误 以下是我的 schema xml 模型 调用它的代码以及我得到的错误 更奇怪的是 尽管出现错误 但在我重新启动 Tomcat 后 该模型仍会
  • DI Control-Freak 反模式:难以理解

    我正在阅读 Mark Seemann 写的 NET 中的依赖注入 但我无论如何也无法理解这一点 虽然new当涉及到 VOLATILE 时 关键字是一种代码味道 依赖性 您无需担心将其用于稳定 依赖性 这new一般来说 关键字不会突然变得 非
  • List 与 IEnumerable 的协变和逆变

    所以 假设我有 Public Interface ISomeInterface End Interface Public Class SomeClass Implements ISomeInterface End Class 如果我有MyL

随机推荐

  • 如何固定文本区域的字符数宽度? (cols 属性不起作用)

    我想根据最大数量指定文本区域的宽度等宽字体他们应该能够在每一行中容纳的字符既没有多余的剩余空间 也没有溢出 有一些类似的问题 但一致的答案是使用cols属性 显然不起作用 如图所示这个jsFiddle 它的 HTML 是这样的
  • 如何使用 Spark 上下文访问 Web URL

    我尝试使用 textFile 方法从 Spark shell 中使用 WEB URL 但出现错误 也许这不是正确的方法 那么有人可以告诉我如何从 Spark 上下文访问 Web URL 我使用的是spark版本1 3 0 Scala 版本
  • 实体框架中的多个自引用关系

    我目前有一个名为EmployeeDetails如下所示 public class EmployeeDetails public int EmployeeDetailsId get set public string Name get set
  • 在 Java 中以 1000 个线程递增 AtomicInteger 不会生成值 1000 [重复]

    这个问题在这里已经有答案了 我正在执行一个java代码 其中我有一个AtomicInteger其中 1000 个线程正在尝试执行incrementAndGet 我预计最终值为 1000 但每次运行都会生成各种不同的值 代码如下 class
  • 如何在 JGit 中“git log --follow ”? (检索完整历史记录,包括重命名)

    我必须如何扩展以下 logCommand 才能获得 follow的选项git log命令工作 Git git new Git myRepository Iterable
  • 有关 asp.net mvc 上的 C# 和 bool 的帮助

    根据值打印 是 或 否 的最佳方法是什么 在我看来我想打印出来 模型 isStudent 我不想要 True 或 False 我想要 Yes 或 No 我必须写 if else 语句吗 编写一个辅助方法 public static clas
  • 更改嵌套记录中的属性值

    是否可以使用with关键字创建嵌套记录的新实例 其嵌套属性具有不同的值 两种情况 简单属性和集合 让我们看一个例子 class Program static void Main string args var company new Com
  • d3.js - 堆积条形图中的第 2 组数据值

    我有以下 csv 数据 date scanned unscanned compid sbu 01 2014 10 90 101 f r 02 2014 55 40 101 f r 03 2014 45 23 101 f r 04 2014
  • 太阳路径的计算

    我正在编写几种计算太阳穿过特定点的路径所需的方法 我使用两个不同的源编写代码进行计算 但都没有产生所需的结果 来源是 http www pveducation org pvcdrom properties of sunlight suns
  • Thymeleaf 使用 th:each 动态创建表单

    我想知道如何创建使用的表单th object对于循环中的每个对象th each 例如 我有以下代码 HTML
  • 异步回发不会导致 document.ready 被执行

    我必须对几个页面中使用的用户控件进行一些更改 用户控件包含一些 JQuery 来处理分页任务 显示 3 个月的数据并一次隐藏 9 个月 当控件加载时 它会自动显示当前季度并执行 document ready 中的这段代码 我遇到的问题是 在
  • 使用 OpenCV 进行模式识别

    我正在尝试检测绿色田野上的物体上的图案 该图案由三种颜色组成 两侧有两个粉色标记 中间有一个蓝色标记 排列得像交通灯一样 起初 我尝试将网络摄像头的图像转换为 HSV 色彩空间 并使用 cvInRangeS 隔离颜色 但随着白天房间内光线的
  • 如何选择活动模型序列化器关系所需的属性

    我正在使用JSONAPI格式随着主动模型序列化器创建一个 apiRails API 我有一个序列化器 它显示特定的post那有很多topics目前 在关系下列出了这些主题 目前它只列出了 id 和类型 我也想显示主题的标题 有人会说用inc
  • Android 应用程序发布后,如何向 SQLite 数据库添加新列?

    我想向 SQLite 数据库添加新列 但我已经在 Play 商店上发布了我的应用程序 因此 如果我编辑它 用户需要卸载并重新安装该应用程序 但我不想要那样 请帮忙 我是 Android 新手 1 增加 或简单地更改 您的数据库版本 2 这会
  • 会话验证过滤器,当会话过期时注销用户

    我有一个会话验证过滤器 可以在会话过期时注销用户 这是一段代码 但这不起作用 不起作用意味着即使会话过期也不会重定向到登录页面 请帮我解决这个问题 public void doFilter ServletRequest request Se
  • 移位 Swift 数组

    颜色阵列 let colorArray UIColor redColor UIColor orangeColor UIColor yellowColor UIColor greenColor UIColor blueColor 目标是shi
  • 如何将 JQuery-UI 与 Aurelia 结合使用

    我使用 Aurelia CLI 启动了一个新的 Aurelia 应用程序 我按照 Aurelia 文档中的说明安装了 JQuery 并配置了 aurelia json http aurelia io hub html doc article
  • Paypal 自适应付款返回网址调用两次

    我已经实现了贝宝自适应支付方法并使用网络流程 付款后 当我明确单击返回按钮时 返回网址会调用两次 但如果我等待自动重定向 则它只会调用一次 我无法理解为什么 return url 调用了两次 请指教 我正在使用下面的代码 public st
  • 如何将 atan2() 映射到 0-360 度

    atan2 y x 在 180 处有不连续性 顺时针方向切换到 180 0 如何将值范围映射到 0 360 这是我的代码 CGSize deltaPoint CGSizeMake endPoint x startPoint x endPoi
  • 使用较新的 RichEdit 版本?

    我尝试过在 C 上使用 RichTextBox 发现处理数千行长文本时速度太慢 经过一番谷歌搜索 我发现这是因为 net默认使用RichEdit 2 0 解决方案是使用RichEdit 5 0 C RichEditBox 性能极慢 加载 4