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

用于语法高亮的快速彩色文本框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (877投票s)

2011年2月24日

LGPL3

23分钟阅读

viewsIcon

8429878

downloadIcon

105129

具有语法高亮显示的自定义文本编辑器。

FastColoredTextBox_/fastcoloredtextbox1.png

引言

对于我的一个项目,我需要一个带有语法高亮的文本编辑器。起初,我使用了一个继承自 RichTextBox 的组件,但在处理大量文本时,我发现 RichTextBox 高亮大量彩色片段(200 个或更多)的速度非常慢。当这种高亮需要动态地进行时,这会导致一个严重的问题。

因此,我创建了自己的文本组件,它既不使用 Windows TextBox 也不使用 RichTextBox

文本的渲染完全通过 GDI+ 完成。

该组件处理大量文本的速度足够快,并且还拥有方便进行动态语法高亮的工具。

它具有前景色、字体样式、背景色等设置,可以针对任意选定的文本符号进行调整。可以使用正则表达式轻松访问文本。还支持自动换行、查找/替换、代码折叠和多级撤销/重做。

实现

为了存储文本字符,使用了 Char 结构

public struct Char
{
    public char c;
    public StyleIndex style;
}

该结构存储符号(char,2 字节)和样式索引掩码(StyleIndex,2 字节)。因此,文本中的每个字符消耗 4 字节内存。符号被分组到行中,这些行使用 List<Char> 实现。

StyleIndex 是应用于此字符的样式索引掩码。StyleIndex 的每个位都意味着此符号将以相应的样式绘制。由于 StyleIndex 有 16 位,因此控件最多支持 16 种不同的样式。

样式存储在一个单独的列表中

public readonly Style[] Styles = new Style[sizeof(ushort)*8];

实际上,Style 是字符、背景、边框和文本其他设计元素的渲染器。
下面是用于渲染文本字符的其中一种样式的典型实现

public class TextStyle : Style
{
    public Brush ForeBrush { get; set; }
    public Brush BackgroundBrush { get; set; }
    public FontStyle FontStyle { get; set; }

    public override void Draw(Graphics gr, Point position, Range range)
    {
        //draw background
        if (BackgroundBrush != null)
            gr.FillRectangle(BackgroundBrush, position.X, position.Y, 
        (range.End.iChar - range.Start.iChar) * 
        range.tb.CharWidth, range.tb.CharHeight);
        //draw chars
        Font f = new Font(range.tb.Font, FontStyle);
        Line line = range.tb[range.Start.iLine];
        float dx = range.tb.CharWidth;
        float y = position.Y - 2f;
        float x = position.X - 2f;

        Brush foreBrush = this.ForeBrush ?? new SolidBrush(range.tb.ForeColor);

        for (int i = range.Start.iChar; i < range.End.iChar; i++)
        {
            //draw char
            gr.DrawString(line[i].c.ToString(), f, foreBrush, x, y);
            x += dx;
        }
    }
}

TextStyle 包含文本的前景色、背景色和字体样式。创建新样式时,组件会在其列表中检查样式,如果不存在该样式,它将创建一个新样式,并带有其索引。

您可以创建自定义样式,继承自 Style 类。

为了处理文本片段,使用了 Range 类,它表示一个连续的文本块,给定起始和结束位置

public class Range
{
    Place start;
    Place end;
}
public struct Place
{
    int iLine;
    int iChar;
}

Using the Code

语法高亮

RichTextBox 不同,该组件不使用 RTF。关于符号颜色和类型的信息仅保存在组件中。这意味着每次输入文本时都必须重新着色组件。在这种情况下,会应用 TextChanged 事件。

一个 Range 对象,其中包含有关修改后的文本范围的信息,会传递到 TextChanged 事件中。它只允许高亮更改的文本片段。

为了搜索需要着色的文本片段,可以使用重载方法 Range.SetStyle(),它接受搜索模式(正则表达式)。例如,以下代码可用于搜索和着色 C# 代码中的注释(以两个正斜杠开头的那部分行)

Style GreenStyle = new TextStyle(Brushes.Green, null, FontStyle.Italic);
...
private void fastColoredTextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    //clear style of changed range
    e.ChangedRange.ClearStyle(GreenStyle);
    //comment highlighting
    e.ChangedRange.SetStyle(GreenStyle, @"//.*$", RegexOptions.Multiline);
} 

在开始着色调用之前,使用方法 Range.ClearStyle() 清除并删除以前的样式。

方法 SetStyle() 会高亮与正则表达式对应的文本片段。但是,如果表达式包含命名组“range”,则会高亮名为“range”的组。在以下示例中,关键字“class”、“struct”和“enum”之后的类名以粗体显示

e.ChangedRange.SetStyle(BoldStyle, @"\b(class|struct|enum)\s+(?<range>[\w_]+?)\b");

在演示应用程序中实现了用于着色 C#、VB、HTML 和其他语言语法的 TextChanged 事件处理程序。

除了 TextChanged 事件,TextChangingVisibleRangeChangedSelectionChanged 事件也可能很有用。TextChanging 事件在文本开始修改之前发生。SelectionChanged 事件在组件中光标位置更改后或在修改选定文本片段时发生。

代码折叠

控件允许隐藏文本块。要隐藏选定的文本,请使用方法 CollapseBlock()

 fastColoredTextBox1.CollapseBlock(fastColoredTextBox1.Selection.Start.iLine, 
                fastColoredTextBox1.Selection.End.iLine);

结果如下图所示

FastColoredTextBox_/foldingSelection.png

组件支持自动搜索折叠片段(折叠区域)。要设置模式(正则表达式)以查找折叠块的开头和结尾,请在 TextChanged 处理程序中使用方法 Range.SetFoldingMarkers()

例如,要搜索块 {..}#region .. #endregion,请使用以下处理程序

private void fastColoredTextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    //clear folding markers of changed range
    e.ChangedRange.ClearFoldingMarkers();
    //set folding markers
    e.ChangedRange.SetFoldingMarkers("{", "}");
    e.ChangedRange.SetFoldingMarkers(@"#region\b", @"#endregion\b");
}

结果如下图所示

FastColoredTextBox_/FoldingMarkers.png

折叠块可以相互嵌套。

双击折叠块或单击标记“+”可以打开折叠块。单击折叠区域会选择隐藏块。此外,您可以通过 ExpandBlock() 方法以编程方式打开隐藏块。

演示应用程序包含折叠文本中所有 #region...#endregion 块的示例。

除了隐藏文本,折叠块还有助于视觉上定义光标所在块的边界。为此,控件的左侧绘制了一条垂直线(折叠指示器)。它显示了光标所在当前折叠块的开头和结尾。

自定义代码折叠

使用正则表达式进行代码折叠并不总是能带来预期的结果。

对于更具体的情况,您可以直接设置起始和结束标记块:Line.FoldingStartMarkerLine.FoldingEndMarker

以下代码示例为选定范围创建折叠块

            const string marker = "myMarker";
 
            var currentSelection = fctb.Selection.Clone();
            currentSelection.Normalize();
 
            if (currentSelection.Start.iLine != currentSelection.End.iLine)
            {
                fctb[currentSelection.Start.iLine].FoldingStartMarker = marker;
                fctb[currentSelection.End.iLine].FoldingEndMarker = marker;
                fctb.Invalidate();
            }

注意

  • FoldingMarker 是一个标识符,与文本内容无关。
  • FoldingStartMarkerFoldingEndMarker 对于折叠块必须相同。
  • FCTB 支持具有相同 FoldingMarker 名称的嵌套块。
  • 它还支持两种查找块的策略,使用属性 FindEndOfFoldingBlockStrategy

有关自定义代码折叠的更复杂示例,请参阅 CustomFoldingSample

延迟处理程序

许多事件(TextChangedSelectionChangedVisibleRangeChanged)都有一个挂起版本的事件。延迟事件在主要事件发生后的一定时间后触发。

这意味着什么?如果用户快速输入文本,则在输入每个字符时都会触发 TextChanged。而 TextChangedDelayed 事件只有在用户停止输入后才会工作,并且只触发一次。

这对于大型文本的延迟高亮非常有用。

控件支持以下延迟事件:TextChangedDelayedSelectionChangedDelayedVisibleRangeChangedDelayed。属性 DelayedEventsIntervalDelayedTextChangedInterval 包含挂起时间。

导出到 HTML

控件具有属性 Html。它返回彩色文本的 HTML 版本。您还可以使用 ExportToHTML 类以更灵活地导出到 HTML。您可以将 HTML 导出用于打印文本,或用于为您的网站代码着色。

剪贴板

控件以两种格式复制文本 - 纯文本和 HTML。
如果目标应用程序支持插入 HTML(例如 Microsoft Word),则会插入彩色文本。否则(例如记事本),将插入纯文本。

热键

控件支持以下快捷键

  • 左、右、上、下、Home、End、PageUp、PageDown - 移动光标
  • Shift+(左、右、上、下、Home、End、PageUp、PageDown) - 移动光标并选择
  • Ctrl+F、Ctrl+H - 显示查找和替换对话框
  • F3 - 查找下一个
  • Ctrl+G - 显示转到对话框
  • Ctrl+(C, V, X) - 标准剪贴板操作
  • Ctrl+A - 选择所有文本
  • Ctrl+Z、Alt+Backspace、Ctrl+R - 撤销/重做操作
  • Tab、Shift+Tab - 增加/减少选定范围的左缩进
  • Ctrl+Home、Ctrl+End - 转到文本的第一个/最后一个字符
  • Shift+Ctrl+Home、Shift+Ctrl+End - 转到文本的第一个/最后一个字符并选择
  • Ctrl+左、Ctrl+右 - 按单词左/右移动
  • Shift+Ctrl+左、Shift+Ctrl+右 - 按单词左/右移动并选择
  • Ctrl+-、Shift+Ctrl+- - 向后/向前导航
  • Ctrl+U、Shift+Ctrl+U - 将选定文本转换为大写/小写
  • Ctrl+Shift+C - 在选定行中插入/删除注释前缀
  • Ins - 在插入模式和覆盖模式之间切换
  • Ctrl+Backspace、Ctrl+Del - 删除左/右单词
  • Alt+鼠标、Alt+Shift+(上、下、右、左) - 启用列选择模式
  • Alt+上、Alt+下 - 上/下移动选定行
  • Shift+Del - 删除当前行
  • Ctrl+B、Ctrl+Shift-B、Ctrl+N、Ctrl+Shift+N - 添加、删除和导航到书签
  • Esc - 关闭所有打开的工具提示、菜单和提示
  • Ctrl+滚轮 - 缩放
  • Ctrl+M、Ctrl+E - 开始/停止宏录制、执行宏
  • Alt+F [字符] - 查找最近的 [字符]
  • Ctrl+(上、下) - 向上/向下滚动
  • Ctrl+(数字键盘加号、数字键盘减号、0) - 放大、缩小、无缩放
  • Ctrl+I - 强制当前行的 AutoIndentChars

注意:您可以更改快捷键映射。在设计模式下使用 Hotkeys 属性,在运行时使用 HotkeysMapping

括号高亮

控件内置括号高亮功能。只需设置属性 LeftBracketRightBracket。如果您想禁用括号高亮,请将其设置为 '\x0'。要调整高亮颜色,请使用属性 BracketsStyle。要调整高亮延迟时间,请更改 DelayedEventsInterval

交互式样式

您可以创建自己的交互式(可点击)样式。为此,请从 Style 派生您的类,并在您重写的 Draw() 方法中调用 AddVisualMarker()。要处理标记上的点击,请使用事件 FastColoredTextBox.VisualMarkerClickStyle.VisualMarkerClick,或者重写方法 Style.OnVisualMarkerClick()
您还可以使用内置样式 ShortcutStyle。此类别在范围的最后一个字符下方绘制一个小型的可点击矩形。

样式优先级

每个 char 最多可以包含 16 种不同的样式。因此,这些样式的绘制顺序很重要。要明确指定绘制顺序,请使用方法 FastColoredTextBox.AddStyle()

fastColoredTextBox1.AddStyle(MyUndermostStyle);
fastColoredTextBox1.AddStyle(MyUpperStyle);
fastColoredTextBox1.AddStyle(MyTopmostStyle);

此方法必须在任何 Range.SetStyle() 调用之前调用。否则,绘制顺序将由 Range.SetStyle() 方法的调用顺序决定。

注意:默认情况下,控件只绘制一种 TextStyle(或继承自该类)样式 - 最底层的样式。但是,您可以使用属性 FastColoredTextBox.AllowSeveralTextStyleDrawing 启用在多个 TextStyle 中绘制符号。这仅适用于 TextStyle(或继承自该类)样式,其他样式(继承自 Style)无论如何都会绘制。

如果 char 没有任何 TextStyle,它将由 FastColoredTextBox.DefaultStyle 绘制。DefaultStyle 会绘制在所有其他样式之上。

如果需要重置绘制顺序,请调用方法 ClearStyleBuffer()

此外,为了调整文本外观,您可以在样式中应用半透明颜色。

内置高亮器

FastColoredTextBox 内置了以下语言的语法高亮:C#、VB、HTML、SQL、PHP、JS、XML、Lua。
注意:您可以为任何语言创建自己的语法高亮器。

属性 HighlightingRangeType 指定在键入时(通过内置高亮器)将高亮文本的哪个部分。值 ChangedRange 提供更好的性能。值 VisibleRangeAllTextRange - 提供更准确的高亮(包括多行注释),但会损失性能。

多行注释高亮

如果您的自定义语言支持多行注释或其他多行运算符,您可能会遇到高亮此类运算符的问题。TextChanged 事件中的属性 ChangedRange 仅包含文本的更改范围。但是多行注释比 ChangedRange 大,因此会导致不正确的高亮。您可以通过以下方式解决此问题:在 TextChanged 处理程序中,使用 FastColoredTextBoxVisibleRangeRange 属性,而不是 ChangedRange。例如

private void fastColoredTextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    //old edition
    //Range range = e.ChangedRange;

    //new edition
    Range range = (sender as FastColoredTextBox).VisibleRange;//or (sender as 
                        //FastColoredTextBox).Range

    //clear style of changed range
    range.ClearStyle(GreenStyle);
    //comment highlighting
    range.SetStyle(GreenStyle, @"//.*$", RegexOptions.Multiline);
    range.SetStyle(GreenStyle, @"(/\*.*?\*/)|(/\*.*)", RegexOptions.Singleline);
    range.SetStyle(GreenStyle, @"(/\*.*?\*/)|(.*\*/)", RegexOptions.Singleline | 
                RegexOptions.RightToLeft);
}

注意:使用 VisibleRange 而不是 ChangedRange 会降低控件的性能。
注意:如果使用内置高亮器,可以调整属性 HighlightingRangeType

使用 XML 语法描述符

组件可以使用 XML 文件进行语法高亮。文件名在 DescriptionFile 属性中指定。

要进行高亮显示,您需要将 Language 属性设置为 Custom

该文件可以包含样式信息、语法高亮规则、折叠参数和括号。
以下是有效标签及其属性的列表

  • <doc>...</doc> - 根 XML 节点。
  • <brackets left="..." right="..." left2="..." right2="..." /> - 设置用于高亮的括号
  • <style name="..." color="..." backColor="..." fontStyle="..." /> - 设置名为 name 的样式。标签 <style> 仅创建 TextStyle 类型的样式。colorbackColor 确定前景色和背景色。允许使用字符串颜色名称或 #RGB 或 #ARGB 形式的十六进制表示。fontStyle - FontStyle 参数的枚举。
    <style> 标签的顺序决定了这些样式的渲染顺序。
  • <rule style="..." options="...">regex pattern</rule> - 设置高亮规则。style - 在 <style> 标签中描述的样式名称。options - RegexOptions 参数的枚举。标签内容 - 用于高亮的正则表达式模式。
  • <folding start="..." finish="..." options="..."> - 指定折叠规则。startfinish 设置块开头和结尾的正则表达式。options - RegexOptions 参数的枚举。

以下是用于 HTML 语法高亮的 XML 文件示例

<doc>
    <brackets left="&lt;" right="&gt;" />
    <style name="Maroon" color="Maroon" fontStyle="Bold,Italic" />
    <style name="Blue" color="Blue"/>
    <style name="Red" color="Red" backColor="#f5f5e5" />
    <rule style="Blue">&lt;|/&gt;|&lt;/|&gt;</rule>
    <rule style="Maroon">&lt;(?&lt;range&gt;[!\w\d]+)</rule>
    <rule style="Maroon">&lt;/(?&lt;range&gt;[\w\d]+)&gt;</rule>
    <rule style="Red" options="Multiline">(?&lt;range&gt;\S+?)='[^']*
        '|(?&lt;range&gt;\S+)="[^"]*"|(?&lt;range&gt;\S+)=\S+</rule>
    <folding start="&lt;div" finish="&lt;/div&gt;" options="IgnoreCase"/>
</doc>

后退/前进导航

控件会记住用户访问过的行。您可以按 [Ctrl + -] 或调用 NavigateBackward() 返回到上一个位置。同样,[Ctrl + Shift + -] 和方法 NavigateForward()
您还可以使用属性 Line.LastVisit 获取上次访问此行的信息。在 PowerfulCSharpEditor 示例中,此属性用于多标签模式下的导航,当您打开多个文档时。

象形文字和宽字符

控件支持输入和显示象形文字及其他宽字符(CJK 语言、阿拉伯语等)。还支持输入法编辑器 (IME)。
要启用此功能,请将属性 ImeMode 切换到 On 状态。
演示包含 IME 功能使用示例。
注意:为了正常显示宽字符,可能需要更大的字体大小。
注意:启用 IME 模式可能会降低控件性能。

自动完成

该库具有 AutocompleteMenu 类,用于实现自动完成功能(例如 IntelliSense 弹出菜单)。
AutocompleteMenu 包含 AutocompleteItem 列表。它支持项目的显示、过滤和插入。
您可以将 AutocompleteMenu 用于代码片段、关键字、方法和属性提示。

请注意 FragmentSearchPatternMinFragmentLengthItems.ImageListItems.SetAutocompleteItems() 等属性和方法。

您可以重写 AutocompleteItem 类以获得更灵活的功能。

此外,您可以使用更高级的控件 AutocompleteMenu[^]。AutocompleteMenu 与 FastColoredTextBox 完全兼容。

有关更多信息,请参阅 AutocompleteSampleAutocompleteSample2

自动缩进

当用户输入文本并启用 AutoIndent 时,控件会自动确定输入字符串的左缩进。

默认情况下,缩进根据代码折叠标记进行。但是,如果您选择特定的 Language,则由集成高亮器为相应语言进行填充。

您可以设置自己的缩进规则。
使用 AutoIndentNeeded 事件。
处理程序必须返回两个值:ShiftShiftNextLines

Shift 值表示此行相对于上一行的缩进(以字符为单位,可以为负)。ShiftNextLines 值表示将应用于此行之后后续行的缩进。

图片显示了一些可能的变体

FastColoredTextBox_/AutoIndent1.png

FastColoredTextBox_/AutoIndent2.png

AutoIndentNeeded 处理程序的示例显示在 AutoIndentSample 中。

注意:如果您处理 AutoIndentNeeded 事件,内置高亮器的缩进将禁用。

此外,您可以手动对选定文本进行 AutoIndent。只需调用 DoAutoIndent() 方法。下图显示了调用前后的文本

FastColoredTextBox_/AutoIndentExample1.png

这是调用 DoAutoIndent() 之后的图片

FastColoredTextBox_/AutoIndentExample2.png

自动缩进字符

该控件可以对相邻行中的单个字符位置进行对齐。此功能称为 AutoIndentChars。

示例如下

FastColoredTextBox_/AutoIndentChars.png

属性 AutoIndentCharsPatterns 包含一组模式(每行一个模式)。

当用户键入字符时,将针对每个模式检查行。如果字符串适合某些模式,则检查附近的行(这些行的左缩进必须与当前行的缩进匹配)。然后,通过插入空格来对齐找到的行中的这些符号。哪些符号将被对齐由正则表达式的命名组定义,组名必须是“range”。请参阅示例

FastColoredTextBox_/AutoIndentChars2.png

在此示例中,将对齐符号“=”及其后面的文本。

要停用 AutoIndentChars,请将属性 AutoIndentChars 设置为 false(默认情况下为 true)。内置语法高亮器已包含 AutoIndentChars 所需的模式,因此您无需定义它。

您可以通过 DoAutoIndentChars() 方法以编程方式执行 AutoIndentChars。此外,用户可以通过快捷键 Ctrl+I 调用 AutoIndentChars(即使 AutoIndentChars = false,它也会工作)。

自定义 AutoIndentChars 请参阅示例 AutoIndentCharsSample

打印

该组件内置打印功能。要打印所有文本或选定范围,请调用方法 Print()。您可以通过传递 PrintDialogSettings 对象来指定要显示的对话框。默认情况下,该方法打印所有文本,不显示对话框。

延迟文件加载

处理超大文件(100k 行或更多)时,“懒惰”模式可能会很有用。在此模式下,控件打开文件并根据需要读取其部分。未使用的文本片段会从内存中删除。此模式由三种方法支持
OpenBindingFile() - 以独占模式打开文件进行读取。
CloseBindingFile() - 关闭已打开的文件。调用后,控件返回简单(非懒惰)模式。
SaveToFile() - 将文本保存到文件。此方法后,控件将绑定到新文件。此方法也可以在简单(非懒惰)模式下使用。

分屏模式

该控件具有类型为 FastColoredTextBox 的属性 SourceTextBox。如果您将此属性设置为另一个文本框,则两个控件将显示相同的文本。此模式可用于分屏,您可以在不同的位置编辑相同的文本。

列选择模式

组件支持列选择模式。激活后,用户可以处理文本的垂直片段

要启用列选择模式,请按 Alt 键并通过鼠标选择区域。另一种方式是按 Alt+Shift 并通过箭头键选择区域。要关闭此模式,只需单击控件或按任意箭头键。

列选择模式支持文本输入(包括 Del 和 Backspace,但不包括插入或删除行)、剪贴板操作、清除选择、撤销/重做操作。

箭头键(右、左、上、下等)会关闭列模式。

此外,如果您调用方法 Text{set;}AppendText,列模式将关闭。方法 InsertTextSelectedText 不会更改选择模式。

如果您想以编程方式启用/禁用选择模式,请使用属性 Selection.ColumnSelectionMode

自动换行模式不支持列选择。

书签

该控件内置书签功能。您可以使用属性 Bookmarks 来访问书签。此外,用户可以使用快捷键 Ctrl-BCtrl-Shift-BCtrl-N 来添加、删除和导航到书签。

注意: 书签即使在虚拟模式下(懒惰加载模式、自定义 TextSource 等)也能工作

工具提示

组件支持工具提示。为此,您需要处理事件 ToolTipNeeded 并传递工具提示参数。当用户将鼠标移到文本上方时,会触发 ToolTipNeeded。鼠标停止后,在 ToolTipDelay 毫秒后,将调用 ToolTipNeeded 并显示弹出工具提示。

提示

组件支持内置提示。这是一个强大的功能,允许您将提示插入到文本中。

提示可以包含简单的文本或任意控件。提示与范围链接,当用户滚动文本框时,提示会随之移动。如果用户按下 Esc 或更改文本,所有提示都会被删除。

Hint 类有多种显示模式。Dock 属性允许将提示放置在整行上。如果 Inline 属性为 True,提示将嵌入到文本中,否则提示将位于文本上方。

您还可以调整背景、边框、字体等的颜色。如果用户点击提示,将调用 HintClick 事件。要创建和显示提示,请使用集合 Hints。此外,FastColoredTextBox 还有辅助方法来添加和删除提示:AddHint()ClearHints()

调用方法 Hint.DoVisible() 可将文本框滚动到提示处。

宏录制

FCTB 支持宏录制。激活录制后,FCTB 会记住所有按下的键。稍后您可以执行录制的序列。

宏会记住所有输入的符号和控制键(包括 Ctrl-C、Ctrl-V、Home、End 等)。但宏不支持鼠标选择。

用户可以按 Ctrl-M 开始/停止录制。执行宏 - Ctrl-E。

为了提高宏的效率,引入了“字符查找”功能。按 Alt-F 和任意字符。将在文本中找到输入的字符,并将光标放置在找到的字符之后。

您可以通过属性 MacrosManager 访问宏基础设施。在那里您可以以编程方式控制宏。

自动换行缩进

属性 WordWrapAutoIndent 自动将次要自动换行行按第一行的移位量进行移位

属性 WordWrapIndent 指定次要自动换行行的额外移位(以字符为单位)

WordWrapAutoIndent 和 WordWrapIndent 属性可以同时操作。当然,它们只在 WordWrap 模式下工作。

注意: 默认情况下,WordWrapAutoIndent 是开启的。如果需要经典的自动换行,请将其关闭。

布局和颜色

下面显示了一些布局和颜色属性

Compact Framework 版本

FastColoredTextBox_/FCTB_CF.PNG

该控件在 .NET Compact Framework 2.0 下运行。这意味着您可以将其用于移动平台(PocketPC、智能手机、PDA 等)。

CF 版本支持所有功能,但以下除外

  • 不支持 IME 模式和宽字符。
  • 不支持 AutocompleteMenu
  • 不支持内置打印。

其余功能均有,仅与完整版略有不同。

示例

演示应用程序有许多示例。下面是简要说明

  • 强大示例。包含许多功能:语法高亮、代码折叠、导出、相同单词高亮等。
  • PowerfulCSharpEditor。 功能强大的多标签 C# 源文件编辑器。支持高亮、多标签后退/前进导航、动态方法列表、自动完成等。

  • 最简单的语法高亮示例。展示如何进行最简单的语法高亮。
  • 标记示例。展示如何制作标记工具。示例使用 ShortcutStyle 类在文本区域创建可点击标记

  • 自定义样式示例。此示例展示了如何创建自己的自定义样式。以下自定义样式在单词周围绘制框架

    class EllipseStyle : Style
    {
        public override void Draw(Graphics gr, Point position, Range range)
        {
            //get size of rectangle
            Size size = GetSizeOfRange(range);
            //create rectangle
            Rectangle rect = new Rectangle(position, size);
            //inflate it
            rect.Inflate(2, 2);
            //get rounded rectangle
            var path = GetRoundedRectangle(rect, 7);
            //draw rounded rectangle
            gr.DrawPath(Pens.Red, path);
        }
    }

  • VisibleRangeChangedDelayed 用法示例。此示例展示了如何通过 VisibleRangeChangedDelayed 事件为超大文本高亮语法。
  • 最简单的代码折叠示例。此示例展示了如何进行最简单的代码折叠。
  • 自定义代码折叠示例。此示例展示了如何进行自定义代码折叠(以 Python 为例)。
  • 自动完成示例、自动完成示例 2。示例展示了如何创建自动完成功能

    FastColoredTextBox_/Autocomplete1.png

  • 工具提示示例。 它显示鼠标下单词的工具提示。
  • 动态高亮示例。展示如何进行动态语法高亮。此示例查找程序中声明的函数,并动态高亮它们在 LISP 代码中的所有出现。
  • 通过 XML 描述进行语法高亮。 此示例使用 XML 文件描述语法高亮。
  • IMEmode 示例。 此示例支持 IME 输入模式和宽字符渲染。

    FastColoredTextBox_/IME.png

  • 图像绘制示例。 示例展示了如何绘制图像而不是文本

    FastColoredTextBox_/smile.png
    此示例也支持动画 GIF。

  • 自动缩进示例。 示例展示了如何制作自定义自动缩进功能。
  • BookmarksSample. 示例展示了如何制作书签功能。
  • Logger 示例。 它展示了如何以预定义样式添加文本

    FastColoredTextBox_/loggerSample.png

  • 拆分示例。 它展示了如何实现分屏模式

    FastColoredTextBox_/splitScreen.png

  • 懒惰加载示例。 它展示了如何处理超大文件。
  • 控制台示例。 它展示了如何创建控制台模拟器。
  • HintSample. 它展示了如何使用提示。
  • ReadOnlySample. 该示例展示了如何创建只读文本块。
  • MacrosSample. 此示例展示了如何使用宏进行代码的硬格式化。
  • PredefinedStylesSample. 在这里,我们创建带有预定义样式、超链接和工具提示的大型只读文本。
  • DocumentMapSample. 展示文档地图功能。

  • DiffMergeSample。

  • 笑话示例。 它包含一些附加功能,实现了自定义 TextStyle

    FastColoredTextBox_/JokeSample.png

性能

存储一兆字节的文本大约需要 6 MB 的 RAM(包括撤销/重做堆栈对象)。着色不消耗大量资源。

使用正则表达式和节省内存使用,可以实现高性能组件。我测试了一个包含 50,000 行(约 1.6 MB)C# 代码的文件。插入和语法着色的总时间约为 3 秒。后续文本操作没有明显的延迟。

限制

该组件不支持居中或右对齐,并且仅使用等宽字体。此外,制表符始终替换为空格。

历史

  • 2011 年 2 月 24 日 - 首次发布。
  • 2011 年 2 月 26 日 - 添加了查找/替换功能、缩进功能、行号显示。还添加了 VB 语法高亮。
  • 2011 年 2 月 28 日 - 添加了代码折叠功能(包括当前块高亮)。添加了一些功能(光标闪烁、增加/减少选定文本的缩进)。优化了 ReplaceAll 功能。添加了 HTML 语法高亮。提高了控件的整体性能。
  • 2011 年 3 月 2 日 - 样式逻辑已修订。添加了 HTML 导出。添加了许多示例。添加了许多功能...
  • 2011 年 3 月 3 日 - 提高了性能。修复了一些错误。添加了 SQL、PHP 语法高亮示例。括号高亮现在是内置的。添加了一些快捷键。
  • 2011 年 3 月 4 日 - FastColoredTextBox 现在支持内置的 C#、VB、HTML、SQL、PHP 语法高亮器。
  • 2011 年 3 月 8 日 - 添加了 XML 语法描述符。修复了一些字体渲染错误。
  • 2011 年 3 月 14 日 - 添加了后退/前进导航。添加了 IME 模式和 CJK 语言支持。添加了功能强大的 C# 多标签编辑器示例。
  • 2011 年 3 月 25 日 - 添加了以下功能:彩色文本复制、新行自动缩进、为选定行插入/删除注释前缀、选定文本大小写转换。修复了滚动闪烁问题。修复了一些错误。添加了图像绘制示例。
  • 2011 年 4 月 7 日 - 添加了 AutocompleteMenu 类。修订了 Autocomplete 示例。添加了一些其他功能。
  • 2011 年 4 月 15 日 - 修订了 AutoIndent。添加了打印功能。
  • 2011 年 5 月 30 日 - 控件从 FW3.5 降级到 FW2.0。
  • 2011 年 6 月 8 日 - 添加了 .NET Compact Framework 2.0 版本。添加了一些功能。修复了一些错误。提高了性能。
  • 2011 年 6 月 18 日 - 许可证从 GPLv3 更改为 LGPLv3。现在您可以在专有软件中使用该控件。
  • 2011 年 6 月 29 日 - 更改了 AutoIndent、Home 键、单词选择的行为(实际上,我自己制作了 PHP 编辑器,发现这些功能不方便。添加了一些方法、事件和属性(LineInsertedLineRemovedLine.UniqueId)。添加了 BookmarksSample。内置高亮器得到了改进。修复了一些闪烁问题。
  • 2011 年 8 月 17 日 - 改进了对多行注释和运算符的支持(参见属性 HighlightingRangeType)。修复了一些错误。
  • 2012 年 1 月 6 日 - 修复了一些错误。自动完成菜单得到了改进。
  • 2012 年 2 月 4 日 - 添加了分屏模式、懒惰文件加载、覆盖模式。提高了性能。修复了一些错误。
  • 2012 年 3 月 13 日 - 添加了一些属性和示例。修复了一些错误。
  • 2012 年 4 月 30 日 - 错误修复,键行为、选择和自动缩进的微小更改。
  • 2012 年 5 月 2 日 - 添加了列选择模式。
  • 2012 年 9 月 26 日 - 修复了一些错误。更改了一些键的行为。添加了行号打印。添加了双语示例。添加了用于删除当前行和上下移动选定行的快捷键。
  • 2012 年 11 月 3 日 - 添加了属性:AutoIndentExistingLines(您可以禁用现有行的自动缩进),VirtualSpace(在 VirtualSpace 模式下,用户可以将光标设置到文本框的任何位置),FindEndOfFoldingBlockStrategy(您可以调整代码折叠策略)。添加了行选择模式(当用户拖动鼠标经过文本框左侧边距时,将选择相应的行)。修复了一些滚动错误。添加了 HyperlinkSample
  • 2013 年 1 月 23 日 - 控件支持内置书签、工具提示和提示。添加了 OnPaste 事件。修复了本地化和绑定到 Text 属性的错误。改进了 AutocompleteMenu 的显示。此外,改进了 IncreaseIndentDecreaseIndent 方法的行为。现在您可以更改内置语法高亮器的配色方案(请参阅属性 KeywordStyleStringStyle 等)。添加了有用的方法 GetStylesOfChar()。扩展了 SQL 高亮。改进了一些示例。添加了 HintSample 示例。现在支持拖放。
  • 2013 年 2 月 14 日 - 控件支持只读块、缩放。添加了示例 ReadOnlyBlocksSamplePredefinedStylesSample。组件的源代码现在可在 GitHub 上获取。
  • 2013 年 2 月 26 日 - 现在支持宏,添加了 MacrosSample。实现了以下功能:文本区域周围的边框、字符查找。缩进得到了改进。鼠标滚动得到了改进。
  • 2013 年 3 月 3 日 - 添加了快捷键映射。现在您可以更改 FTCB 的快捷键。此外,缩放和滚动也得到了改进。
  • 2013 年 11 月 7 日 - 添加了文档地图。许多功能得到了改进。
  • 2013 年 12 月 13 日 - 添加了 DiffMerge 示例。添加了与 Irony 集成的示例。
  • 2013 年 12 月 23 日 - 添加了属性 WordWrapAutoIndentWordWrapIndent。添加了自定义自动换行模式(请参阅示例 CustomWordWrappingSample)。现在支持自定义外部滚动条(请参阅 CustomScrollBarSample)。
  • 2014 年 3 月 29 日 - 添加了括号自动完成。添加了带文件编码自动检测的 OpenFile 方法。
  • 2014 年 7 月 12 日 - 添加了 AutoIndentChars 功能(详情请参阅文章)。添加了 AutoIndentCharsSample。内置高亮器现在支持 LuaXML
  • 2014 年 10 月 25 日 - 添加了 Nuget 包。
© . All rights reserved.