关于富编辑控件

以下是本节中要讨论的主题。

Rich Edit 的版本

Rich Edit 控件的原始规范是 Microsoft Rich Edit 1.0;最新规范为 Microsoft Rich Edit 4.1。 每个版本的 Rich Edit 都是上述版本的超集,只是只有 Microsoft Rich Edit 1.0 的亚洲版本具有垂直文本选项。 在创建 Rich Edit 控件之前,应调用 LoadLibrary 函数来验证已安装哪个版本的 Microsoft Rich Edit。

下表显示了哪个 DLL 对应于哪个版本的 Rich Edit。 请注意,文件的名称未从版本 2.0 更改为版本 3.0。 这允许将版本 2.0 升级到版本 3.0,而不会中断现有代码。

Rich Edit 版本 DLL 窗口类
1.0 Riched32.dll RICHEDIT_CLASS
2.0 Riched20.dll RICHEDIT_CLASS
3.0 Riched20.dll RICHEDIT_CLASS
4.1 Msftedit.dll MSFTEDIT_CLASS

Rich Edit 版本 1.0

Microsoft Rich Edit 1.0 包含以下功能。

功能 说明
文本输入和选择 大多数是标准(系统编辑控件)选择和文本输入。 选择栏支持(选择栏是每个段落左侧的一个未标记区域,单击该区域时会选择行)。 自动换行和自动选择选项。 单击、双击和三次单击选择。
ANSI(单字节字符集 (SBCS) 和多字节字符集 (MBCS))编辑 但是,没有 Unicode 编辑。
字符/段落格式设置属性的基本集合 请参阅 CHARFORMATPARAFORMAT
字符格式属性 字体名称和大小、粗体、斜体、实线、删除线、受保护、链接、偏移量和文本颜色。
段落格式属性 开始缩进、右缩进、后续行偏移量、项目符号、对齐方式(左、居中、右)和制表符。
向前查找 包括不区分大小写和匹配全字选项。
基于消息的接口 几乎是系统编辑控制消息集的超集加上两个接口,即 IRichEditOleIRichEditOleCallback
嵌入对象 需要基于 IRichEditOleIRichEditOleCallback 接口的客户端协作。
右键菜单支持 使用 IRichEditOleCallback 接口。
拖放编辑 支持拖放编辑。
通知 WM_COMMAND 消息发送到客户端以及许多其他消息。 这是公共控件通知的超集。
单级撤消/重做 行为类似于系统编辑控件。 选择撤消将反转最后一个操作,然后该操作将成为新的重做操作。
简单垂直文本 (仅限亚洲版本)。
输入法编辑器 (IME) 支持 (仅限亚洲版本)。
使用打印机指标进行 WYSIWYG 编辑 Microsoft WordPad 尤其需要此功能。
剪切/复制/粘贴/StreamIn/StreamOut 使用纯文本 (CF_TEXT) 或 RTF 格式 (RTF)(带对象和不带对象)。
C 代码库 代码是用 C 编写的,可提供坚实且通用的基础。
针对不同脚本的不同版本 Microsoft Rich Edit 1.0 解决了不同版本的本地化问题。

Rich Edit 版本 2.0

Microsoft Rich Edit 2.0 合并了多项附加功能,例如对 Unicode 和亚洲语言的支持、多级撤消、组件对象模型 (COM) 接口以及许多 UI 增强功能。

除了 Microsoft Rich Edit 1.0 提供的功能外,Microsoft Rich Edit 1.0 还包括以下功能。

功能 说明
Unicode Unicode 简化了处理国际文本的工作。 但是,需要努力保持与现有非 Unicode 文档的兼容性,即能够在非 Unicode 纯文本和富文本之间转换。
通用国际支持 通用换行算法(Kinsoku规则的扩展),简单的字体链接,键盘字体切换。
亚洲支持 IME 支持 2 级(对话框)和 3 级(内联)。
向上查找/向下查找支持 支持向前搜索和向后搜索。
双向支持 这包含在 Microsoft Rich Edit 2.1 中
多级撤消 可扩展的撤消体系结构允许客户端参与应用程序范围的撤消模型。
Magellan 鼠标支持 这是带有滚动滚轮的鼠标。
双字体支持 当活动字体不适合当前键盘时,键盘可以自动切换字体,例如 Times New Roman 显示汉字。
智能字体应用 字体更改请求不能将西方字体应用于亚洲字符。
改进了显示 当多个字体出现在同一行时,将使用屏幕外位图。 例如,这使得单词 cool 的最后一个字母不会被砍掉。
透明度支持 也是在无窗口模式下。
系统选择颜色 用于选择文本。
自动 URL 识别 可以检查多种 URL 格式(例如,http:)
Microsoft Word 编辑 UI 兼容性 选择、光标键盘语义。
Word 标准 EOP 段落结束标记 (CR) 还可以处理回车/换行符(CR/LF)(回车符、换行符)。
纯文本和富文本功能 单字符格式和单段落格式。
单行和多行控件 在段落的第一末端截断,不使用换行符。
快捷键 支持快捷键。
密码窗口样式 密码编辑控件通过 EM_GETPASSWORDCHAREM_SETPASSWORDCHAR 提供。
可扩展的体系结构 减小实例大小。
无窗口操作和接口 这通过 ITextHostITextServices 接口提供。
COM 双重接口 文本对象模型 (TOM) 接口。
CHARFORMAT2 添加了字体粗细、背景色、区域设置标识符、下划线类型、上标和下标(除偏移量外)、禁用效果。 仅对于 RTF 往返,增加了字母之间的间距、字符对的字符长度、动画文本类型、各种效果:字体阴影/轮廓、全大写、小写、隐藏、浮雕、压印和修订。
PARAFORMAT2 增加了前后空格和字行间距。 对于仅 RTF 往返,添加了底纹粗细/样式、编号起始/样式/制表符、边框空间/宽度/边、选项卡对齐/标题、各种 Word 段落效果:RTL 段落、保留下一个、前一页换行、无行号、无窗口控制、不允许连字符、并排。
更多 RTF 往返 所有 Word FormatFont 和 FormatParagraph 属性。
代码稳定性和稳定化 示例:参数和对象验证、函数不变量、可重入性保护、对象稳定。
强大的测试基础结构 包括广泛的回归测试。
提升了性能 更小的工作集、更快的加载和重新显示时间等。
C++ 代码库 代码是用 C++ 编写的,这为构建 Microsoft Rich Edit 3.0 提供了坚实的基础。

除了少数例外,Microsoft Rich Edit 2.0 使用与 Microsoft Rich Edit 1.0 相同的函数、结构和消息。 但是,请注意以下差异:

  • Microsoft Rich Edit 1.0 窗口类的名称为 RichEdit。 Microsoft Rich Edit 2.0 同时具有 ANSI 和 Unicode 窗口类 RichEdit20ARichEdit20W。 要指定适当的富文本编辑窗口类,请使用 RICHEDIT_CLASS 常量,Richedit.h 文件根据 UNICODE 编译标志的定义来定义该常量。

  • 在 Microsoft Rich Edit 2.0 中,如果创建 Unicode Rich Edit 控件(需要 Unicode 文本消息的控件),则必须在发送到该控件的任何窗口消息中仅指定 Unicode 数据。 同样,如果创建 ANSI Rich Edit 控件,则仅发送 ANSI 或双字节字符集 (DBCS) 数据。 可以使用 IsWindowUnicode 函数来确定 Rich Edit 控件是否使用 Unicode 文本消息。 请注意,Rich Edit COM 接口使用 Unicode 文本,除非它们遇到代码页参数。

  • Microsoft Rich Edit 1.0 对段落标记使用了 CR/LF 字符组合。 Microsoft Rich Edit 2.0 仅使用回车符 ('\r')。 Microsoft Rich Edit 3.0 仅使用回车符,但在这方面可以模仿 Microsoft Rich Edit 1.0。

  • Microsoft Rich Edit 2.0 引入了以下新消息。

    消息 说明
    EM_AUTOURLDETECT 启用或禁用自动 URL 检测。
    EM_CANREDO 确定重做队列中是否有任何操作。
    EM_GETIMECOMPMODE 检索当前输入法编辑器 (IME) 模式。
    EM_GETLANGOPTIONS 检索 IME 和亚洲语言支持的选项。
    EM_GETREDONAME 检索重做队列中下一个操作的类型名称。
    EM_GETTEXTMODE 检索文本模式或撤消级别。
    EM_GETUNDONAME 检索撤消队列中下一个操作的类型名称。
    EM_REDO 重做重做队列中的下一个操作。
    EM_SETLANGOPTIONS 设置 IME 和亚洲语言支持的选项。
    EM_SETTEXTMODE 设置文本模式或撤消级别。
    EM_SETUNDOLIMIT 设置撤消队列中的最大操作数。
    EM_STOPGROUPTYPING 停止将连续键入操作分组到当前撤消操作中。
  • Microsoft Rich Edit 2.0 引入了以下新结构。

    结构 说明
    CHARFORMAT2 包含有关字符格式的信息。
    PARAFORMAT2 包含有关段落格式的信息。
  • 以下消息仅在 Microsoft Rich Edit 1.0 的亚洲语言版本中受支持。 Rich Edit 的任何更新版本都不支持它们。

    EM_CONVPOSITION

    EM_GETIMECOLOR

    EM_GETIMEOPTIONS

    EM_GETPUNCTUATION

    EM_GETWORDWRAPMODE

    EM_SETIMECOLOR

    EM_SETIMEOPTIONS

    EM_SETPUNCTUATION

    EM_SETWORDWRAPMODE

Rich Edit 版本 3.0

Microsoft Rich Edit 3.0 是一个单一的、可扩展的全球 DLL,在一个小软件包中提供高性能和与 Word 的兼容性。 Microsoft Rich Edit 3.0 的新功能包括更丰富的文本、缩放、字体绑定、更强大的 IME 支持和丰富的复杂脚本支持(双向、印度语和泰语)。

除了 Microsoft Rich Edit 2.0 提供的功能外,Rich Edit 版本 2.0 还包括以下功能。

功能 说明
缩放 缩放系数由比率给出。
段落编号(单级) 数字、上下字母或罗马数字。
简单表 可以删除和插入行,但不能调整单元格大小或在单元格内换行。 启用高级版式(请参阅 EM_GETTYPOGRAPHYOPTIONS),Microsoft Rich Edit 3.0 可以将列居中对齐或向右对齐,并包括小数。 单元格由制表符模拟,因此文本制表符和回车符都被空格取代。
普通样式和标题样式 EM_SETPARAFORMAT文本对象模型 (TOM) 接口支持内置的普通样式和标题样式 1 到 9。
更多下划线类型 添加了虚线、虚线点、短划线点和下划线。
下划线颜色 带下划线的文本可以使用 15 种文档选项中的一种来标记下划线颜色。
隐藏文本 由 CHARFORMAT2 属性标记。 方便往返(将读取的内容写入文件)通常不应显示的信息。
更多默认热键 这些热键的功能与 Word 中的键相同。 例如,带有欧洲口音的死键(仅限美国键盘)。 数字热键 (CTRL+L) 在可用的编号选项之间循环,从项目符号开始。
HexToUnicode IME 允许用户使用热键在十六进制和 Unicode 之间进行转换。
智能引号 对于美国键盘,此功能可通过 CTRL+ALT+' 来打开和关闭。
软连字符 对于纯文本,请使用 0xAD。 对于 RTF,请使用 -。
斜体光标 此外,鼠标光标在 URL 上时会变为一只手。
高级版式选项 Microsoft Rich Edit 3.0 可以使用高级版式选项进行换行和显示(请参阅 EM_GETTYPOGRAPHYOPTIONS)。 添加了此巧妙选项主要是为了方便处理复杂的脚本(双向、印度语和泰语)。 此外,对于简单的脚本也有许多改进。 示例如下:
  • 居中、靠右、十进制制表符
  • 完全对齐的文本
  • 下划线平均,即使相邻的文本具有不同的字体大小,也可以提供统一的下划线。
复杂文种支持 Microsoft Rich Edit 3.0 支持双向(阿拉伯语和/或希伯来语与其他脚本混合的文本)、印度语(Devangari 等印度脚本)和泰语文本。 为了支持这些复杂的脚本,使用了高级版式和 Uniscribe 组件。
字体绑定 Microsoft Rich Edit 3.0 将自动为显然不属于当前字符集标记的字符选择适当的字体。 这是通过将字符集分配给文本运行并将字体与这些字符集相关联来实现的。 有关详细信息,请参阅字体绑定
特定于字符集的纯文本读/写选项 这允许使用一个字符集读取文件,并使用不同的字符集进行写入。
UTF-8 RTF 建议用于剪切、复制和粘贴操作。 这种文件格式比普通 RTF 更紧凑、更快,并且与 Unicode 兼容。
Microsoft Office 9 IME 支持 (IME98) 这种更强大的输入法功能被分离成一个独立的模块。 功能包括:
  • 在早期的版本中,用户需要先删除最后一个字符串,然后输入一个新字符串以获得正确的候选字符串。 这一新功能使用户能够将最终字符串转换回合成模式,从而允许轻松选择不同的候选字符串。
  • 文档馈送此功能为 IME98 提供当前段落的文本,这有助于 IME98 在键入时执行更准确的转换。
  • 鼠标操作此功能可在键入期间更好地控制候选窗口和 UI 窗口。
  • 插入符号位置 此功能提供当前插入符号和行信息,IME98 使用这些信息来定位 UI 窗口(例如,候选列表)。
主动输入法管理器 (IMM) 支持 用户可以调用 Active IMM 对象,该对象允许用户在美国系统上输入亚洲字符。
HexToUnicode 支持 用户可以使用热键在十六进制表示法和 Unicode 之间转换。
更多 RTF 往返 从文件中读取的 RTF 文本将原封不动地写回。
改进的 1.0 兼容模式 Microsoft Rich Edit 3.0 可以模拟 Microsoft Rich Edit 1.0 行为。 例如,可以在 MBCS 和 Unicode 字符位置 (cp) 映射之间更改。
增强冻结控制 可以通过多个 API 调用冻结显示,然后取消冻结以显示更新。
增强撤消控制 撤消可以暂停和恢复(IME 要求)。
增大/减小字体大小 将字体大小增加或减少到六个标准值之一(12、28、36、48、72 和 80 磅)。

Rich Edit 版本 4.1

Microsoft Rich Edit 4.1 的窗口类是 MSFTEDIT_CLASS。 Microsoft Rich Edit 4.1 的新功能包括连字符、页面旋转和文本服务框架 (TSF) 支持。

除了 Microsoft Rich Edit 3.0 提供的功能外,Rich Edit 版本 3.0 还包括以下功能。

功能 说明
断字 以下 API 支持断字:HyphenateProcEM_SETHYPHENATEINFOEM_GETHYPHENATEINFO
页面旋转 通过 EM_SETPAGEROTATEEM_GETPAGEROTATE 支持从上到下和从下到上的布局。
文本服务框架支持
其他 IME 支持
其他 EM_SETEDITSTYLE 设置 除了 TSF 设置之外,还有排除 IME、设置双向文本流、使用草稿模式字体等新设置。
其他 EM_SETCHARFORMAT 设置 新标志允许客户端为给定的 LCID 或字符集设置默认字体和字体大小,为控件设置默认字体,防止键盘切换以匹配字体等。
将输入限制为 ANSI 文本 EM_SETTEXTMODE 中使用 TM_SINGLECODEPAGE 可防止 Unicode 输入进入 Rich Edit 控件。
不支持的 RTF 关键字通知 当存在不支持的 RTF 关键字时,EN_LOWFIRTF 会警告应用程序。
其他语言支持 其他语言包括亚美尼亚语、迪韦希语、泰卢固语和其他语言。
改进的表支持 功能包括:在单元格内换行、通过 RTF 改进处理以及改进导航。
ES_VERTICAL 支持 ES_VERTICAL 窗口样式。
WM_UNICHAR 支持 若要向 ANSI 窗口发送或发布 Unicode 字符,请使用 WM_UNICHAR。 它等效于 WM_CHAR,但它使用 (UTF)-32。

不支持的编辑控件功能

Rich Edit 控件支持多行编辑控件的大部分功能,但不是全部功能。 本节列出了 Rich Edit 控件支持的编辑控件消息和窗口样式。

以下消息由编辑控件处理,而不是由 Rich Edit 控件处理。

不支持的消息 注释
EM_FMTLINES 不支持。
EM_GETHANDLE Rich Edit 控件不将文本存储为简单的字符数组。
EM_GETIMESTATUS 不支持。
EM_GETMARGINS 不支持。
EM_SETHANDLE Rich Edit 控件不将文本存储为简单的字符数组。
EM_SETIMESTATUS 不支持。
EM_SETMARGINS Microsoft Rich Edit 3.0 支持。
EM_SETRECTNP 不支持。
EM_SETTABSTOPS 改用 EM_SETPARAFORMAT 消息。 Microsoft Rich Edit 3.0 支持。
WM_CTLCOLOR 改用 EM_SETBKGNDCOLOR 消息。
WM_GETFONT 改用 EM_GETCHARFORMAT 消息。

以下窗口样式用于多行编辑控件,但不适用于 Rich Edit 控件:ES_LOWERCASEES_UPPERCASEES_OEMCONVERT

Rich Edit 快捷键

Rich Edit 控件支持以下快捷键。

密钥 Operations 注释
Shift+Backspace 在双向键盘上生成 LRM/LRM BiDi 特定
Ctrl+Tab 制表符
Ctrl+Clear 全选
Ctrl + 数字键 5 全选
Ctrl+A 全选
Ctrl+E 居中对齐
Ctrl+J 调整对齐方式
Ctrl+R 右对齐
Ctrl+L 左对齐
Ctrl+C 副本
Ctrl+V 粘贴
Ctrl+X 剪切
Ctrl+Z 撤消
Ctrl+Y 重做
Ctrl+'+' (Ctrl+Shift+'=') 上标
Ctrl+'=' 下标
Ctrl+1 行距 = 1 行。
Ctrl+2 行距 = 2 行。
Ctrl+5 行距 = 1.5 行。
Ctrl+'(撇号) 强调锐音 按下快捷键后,按相应的字母(例如,a、e 或 u)。 这仅适用于英语、法语、德语、意大利语和西班牙语键盘。
Ctrl+'(重音) 重音符号 请参阅 Ctrl+' 的注释。
Ctrl+~(波形符) 强调文字波浪号 请参阅 Ctrl+' 的注释。
Ctrl+;(分号) 重音元音变音符 请参阅 Ctrl+' 的注释。
Ctrl+Shift+6 强调脱字号(扬抑符) 请参阅 Ctrl+' 的注释。
Ctrl+,(逗号) 强调变音符号 请参阅 Ctrl+' 的注释。
Ctrl+Shift+'(撇号) 激活智能引号
Backspace 如果文本受到保护,请发出“哔”声,不要删除。 否则,删除前一个字符。
Ctrl+Backspace 删除上一个词。 这会生成 VK_F16 代码。
F16 与 Backspace 相同。
Ctrl+Insert 复制
Shift+Insert 粘贴
Insert Overwrite DBCS 不会覆盖。
Ctrl+向左键 将光标向左移动一个词。 在 bidi 键盘上,这取决于文本的方向。
Ctrl+向右键 将光标向右移动一个词。 请参阅 Ctrl+左箭头注释。
Ctrl+Left Shift 左对齐 在 BiDi 文档中,这是用于从左到右的阅读顺序。
Ctrl+Right Shift 右对齐 在 BiDi 文档中,这是用于从右到左的阅读顺序。
Ctrl+向上键 移动到上面的行。
Ctrl+向下键 移动到下面的行。
Ctrl+Home 移动到文档开头。
Ctrl+End 移动到文档末尾。
Ctrl+Page Up 向上移动一页。 如果在 SystemEditMode 和 Single Line 控件中,则不执行任何操作。
Ctrl+Page Down 向下移动一页。 请参阅 Ctrl+Page Up 注释。
Ctrl+Delete 删除下一个词或所选字符。
Shift+Delete 剪切所选字符。
Esc 停止拖放。 拖放文本时。
Alt+Esc 更改活动应用程序。
Alt+X 将插入点前面的 Unicode 十六进制值转换为相应的 Unicode 字符。
Alt+Shift+X 将插入点前面的 Unicode 字符转换为相应的 Unicode 十六进制值。
Alt+0xxx(数字键盘) 如果 xxx 大于 255,则插入 Unicode 值。 如果 xxx 小于 256,则根据当前键盘插入 ASCI 范围文本。 必须输入十进制值。
Alt+Shift+Ctrl+F12 十六进制到 Unicode。 如果已将 Alt+X 用于其他用途。
Alt+Shift+Ctrl+F11 所选文本将输出到调试器窗口,并保存到 %temp%\DumpFontInfo.txt。 仅适用于调试(需要在 Win.ini 中设置 Flag=8)
Ctrl+Shift+A 设置所有上限。
Ctrl+Shift+L Fiddle 项目符号样式。
Ctrl+Shift+向右键 增加字体大小。 字体大小在 4pt-11pt 范围内更改 1 磅;在 12pt-28pt 范围内增加 2 磅;从 28pt -> 36pt -> 48pt -> 72pt -> 80pt 更改;在 80pt - 1630pt 范围内更改 10 磅;最大值为 1638。
Ctrl+Shift+向左键 减小字体大小。 请参阅 Ctrl+Shift+向右键注释。

Conceptual

使用富编辑控件

无窗口 Rich Edit 控件