65.9K
CodeProject 正在变化。 阅读更多。
Home

CRulerRichEditCtrl - 一个完整的 RTF mini 编辑器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (36投票s)

2004年4月23日

公共领域

7分钟阅读

viewsIcon

312130

downloadIcon

18098

一个完整的迷你编辑器,带有格式工具栏和可编辑制表符位置的标尺。

Sample Image - rulerricheditctrl.gif

引言

RTF控件是一个非常有用的工具,但要完成最基本的格式设置任务需要大量的代码。为应用程序添加轻松编辑格式化文本的功能通常很有帮助,但需要付出这么大的工作量?为什么不提供一些直接获取和设置RTF的命令?保存和加载到文件?内置编辑按钮?

CRulerRichEditCtrl 就是这样一款控件(好吧,实际上是控件的组合)。它可以添加到对话框或窗体视图中(当然也可以添加到CView中,但那时你可能需要考虑以WordPad为基础来构建应用程序……)。它包含一个迷你工具栏,带有格式组合框和按钮,一个显示英寸或厘米的标尺,以及制表符设置(可以拖动),还有一个嵌入的RTF控件。整个控件可以编译为Unicode,并使用Riched20.dll

软件包

CRulerRichEditCtrl 由四个主要类组成

  • CRulerRichEditCtrl - 控件本身,派生自CWnd。这是你在应用程序中操作的类。此类还包含标尺。
  • CRulerRichEdit - 一个CRichEditCtrl包装器,用于嵌入的RTF控件。该包使用自己的类,因为它需要处理滚动条消息等。
  • CRRECRuler - 一个CWnd派生的类,用于编辑器标尺。
  • CRRECToolbar - 一个CToolBarCtrl派生的类,用于编辑器工具栏。

一些辅助类

  • CTextFile - 用于加载和保存控件的内容(有关此类,请参阅本文)。
  • CStdGrfx - 一系列用于在系统颜色中绘制的静态函数。此辅助函数来自本文
  • CFontComboBox - 一个字体组合框,显示已安装的字体。
  • CSizeComboBox - 一个简单的组合框,具有预定义的字体大小。

以及一个用于内置工具栏的工具栏资源(位图和rc文件)。

工具栏

工具栏控件和按钮从左到右依次是:

  • 字体名称(一个组合框,用户可以在其中设置选中文本的字体名称)。
  • 字体大小(一个组合框,用户可以在其中设置选中文本的大小)。
  • 字体(设置选中文本的字体。将显示通用的字体对话框)。
  • 颜色拾取器(设置文本的颜色。将显示颜色拾取器)。
  • 粗体(将选中文本设置为粗体)。
  • 斜体(将选中文本设置为斜体)。
  • 下划线(给选中文本加下划线)。
  • 左对齐(将选定的文本或段落左对齐)。
  • 居中(将选定的文本或段落居中)。
  • 右对齐(将选定的文本或段落右对齐)。
  • 增加缩进(将选定的文本或段落缩进到下一个制表位)。
  • 减少缩进(将选定的文本或段落缩进到上一个制表位)。
  • 项目符号(使选定的文本或段落带项目符号)。

按钮处理程序位于父窗口中,但工具栏类同时处理组合框的选择更改以及在文本选择更改时更新它们的函数。

可以通过调用ShowToolbar来隐藏/显示工具栏。IsToolbarVisible将返回工具栏的可见状态。

标尺

标尺显示英寸或厘米的刻度。制表符标记位于制表位(共有32个)。可以通过单击并拖动标尺上的小标记来更改制表符(是的,我知道它们很小,很难命中)。制表符不能移动到其他制表符之前或之后,也不能移动到标尺的开头或结尾。

鼠标消息(WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP)由标尺控件处理。它们通过SendMessage使用已注册的窗口消息urm_RULERACTION传递给父窗口。父窗口处理拖动和设置制表符。

可以通过调用SetMode来更改标尺的显示模式(英寸或厘米),并通过GetMode获取。

可以通过调用ShowRuler来隐藏/显示标尺。IsRulerVisible将返回标尺的可见状态。

RTF相关

从代码中,你可以通过SaveLoad来保存或加载RTF控件的内容。如果你不提供文件名,它们甚至会自动显示一个CFileDialog

你可以通过调用GetRTFSetRTF来直接获取或设置RTF内容。

你可以通过调用SetWindowText以未格式化的文本设置控件。GetWindowText返回文本,GetWindowTextLength返回控件中的字符数。

可以通过调用GetRichEditCtrl直接访问RTF控件本身。

使用代码

CRulerRichEditCtrl派生自CWnd,并且可以像这样使用。它包含资源,所以需要一些设置

  • 将cpp和h文件添加到你的项目中。
  • 在项目的rc2文件中包含RulerRichEditCtrl.rc(你可以在res目录中找到它)。
  • 在父类中声明一个CRulerRichEditCtrl成员,并调用CRulerRichEditCtrl::Create来创建它。

关注点

这个项目实际上是一个彻底的失败。我原本打算进一步研究编辑矩形对多行编辑框和RTF控件的影响(参见本文此文)。

“为什么不提供一个完整的迷你编辑器,带有用于制表符设置图形化操作的标尺,也许还有一些常见的格式按钮——可以轻松地集成到应用程序中”,我想(虽然不是用英语……)。我以相当大的热情开始,实现了标尺以及它与RTF控件之间的通信/同步。想象一下我有多沮丧,当我意识到垂直滚动条会从控件的顶部开始,而不是编辑矩形的顶部,而最初的想法完全没有用!然而,我已经写了这么多代码,觉得不利用这些代码简直是犯罪,因此决定将子控件打包到一个父CWnd中。这仍然可以节省开发时间,尽管解决方案稍微传统一些——同时也演示了拖动和绘制、注册消息、控件同步、简单的RTF流式传输等内容。

首先,我为嵌入的RTF控件设置了ES_AUTOHSCROLL样式。这暴露了控件中的一个bug——在WordPad中也存在。当达到最大的水平位置时,不会发送滚动消息。这意味着文本会继续滚动,但标尺不会同步。唉。无论如何,我将这个样式作为一种选择留给需要它的人——如果在CRulerRichEditCtrl::Create的最后一个参数中传入TRUE,RTF控件将具有AutoHScroll样式。

绘图通常应该在窗口的OnPaintOnDraw处理程序中进行。否则,如果用户切换到另一个应用程序然后再切换回来,或者窗口被覆盖然后再次显示,绘图就会丢失。跟踪是我能想到的一个例外,而我在这里确实是这样做的。不仅如此,我还在父窗口中绘制了两个子窗口,但另一种选择——创建一个特殊的“拖动器”窗口来显示标尺线——在我看来在这个情况下绝对是过度了。

历史

  • 2004年4月23日 初始版本。
  • 2005年5月16日 完全重写,支持Unicode并重新设计了工具栏。

致谢

首先,这已经不再是我的控件了。Unicode适配是由Iain Clarke完成的,他还将工具栏改成了标准的。此外,他提出了工具栏的设计更改,并且确实是这个版本远不止是合著者。所有改进的功劳都归功于他,而次品实现则归咎于我。

我还使用了CodeProject上其他文章中的代码

在文本文件处理类CTextFile的底部现在是David PritchardCStdioFileEx。我已将其中的一些编译警告删除,除此之外,这个出色的类就像一个插件一样可以无缝替换CStdioFile。强烈推荐,在此处获取这里 [^]!

对于工具栏,我添加了Chris Maunder的颜色拾取器(或者更准确地说,colour picker)。我想为这个控件添加一些功能,并将增强功能发回给Chris,但令我沮丧的是,该控件已经尽可能地完美了。你可以在这里 [^]找到颜色拾取器。

© . All rights reserved.