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






4.97/5 (877投票s)
具有语法高亮显示的自定义文本编辑器。
- GitHub上的源代码和演示
- 下载演示
- 下载帮助 (CHM)
- Nuget 包
- 下载 IronyFCTB(FCTB 与解析引擎集成的示例)
- 另请参阅:下载 .NET Compact Framework 2.0 的源代码和演示
引言
对于我的一个项目,我需要一个带有语法高亮的文本编辑器。起初,我使用了一个继承自 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
事件,TextChanging
、VisibleRangeChanged
和 SelectionChanged
事件也可能很有用。TextChanging
事件在文本开始修改之前发生。SelectionChanged
事件在组件中光标位置更改后或在修改选定文本片段时发生。
代码折叠
控件允许隐藏文本块。要隐藏选定的文本,请使用方法 CollapseBlock()
fastColoredTextBox1.CollapseBlock(fastColoredTextBox1.Selection.Start.iLine,
fastColoredTextBox1.Selection.End.iLine);
结果如下图所示
组件支持自动搜索折叠片段(折叠区域)。要设置模式(正则表达式)以查找折叠块的开头和结尾,请在 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");
}
结果如下图所示
折叠块可以相互嵌套。
双击折叠块或单击标记“+”可以打开折叠块。单击折叠区域会选择隐藏块。此外,您可以通过 ExpandBlock()
方法以编程方式打开隐藏块。
演示应用程序包含折叠文本中所有 #region...#endregion
块的示例。
除了隐藏文本,折叠块还有助于视觉上定义光标所在块的边界。为此,控件的左侧绘制了一条垂直线(折叠指示器)。它显示了光标所在当前折叠块的开头和结尾。
自定义代码折叠
使用正则表达式进行代码折叠并不总是能带来预期的结果。
对于更具体的情况,您可以直接设置起始和结束标记块:Line.FoldingStartMarker
和 Line.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 是一个标识符,与文本内容无关。
FoldingStartMarker
和FoldingEndMarker
对于折叠块必须相同。- FCTB 支持具有相同 FoldingMarker 名称的嵌套块。
- 它还支持两种查找块的策略,使用属性
FindEndOfFoldingBlockStrategy
。
有关自定义代码折叠的更复杂示例,请参阅 CustomFoldingSample
。
延迟处理程序
许多事件(TextChanged
、SelectionChanged
、VisibleRangeChanged
)都有一个挂起版本的事件。延迟事件在主要事件发生后的一定时间后触发。
这意味着什么?如果用户快速输入文本,则在输入每个字符时都会触发 TextChanged
。而 TextChangedDelayed
事件只有在用户停止输入后才会工作,并且只触发一次。
这对于大型文本的延迟高亮非常有用。
控件支持以下延迟事件:TextChangedDelayed
、SelectionChangedDelayed
、VisibleRangeChangedDelayed
。属性 DelayedEventsInterval
和 DelayedTextChangedInterval
包含挂起时间。
导出到 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
。
括号高亮
控件内置括号高亮功能。只需设置属性 LeftBracket
和 RightBracket
。如果您想禁用括号高亮,请将其设置为 '\x0
'。要调整高亮颜色,请使用属性 BracketsStyle
。要调整高亮延迟时间,请更改 DelayedEventsInterval
。
交互式样式
您可以创建自己的交互式(可点击)样式。为此,请从 Style
派生您的类,并在您重写的 Draw()
方法中调用 AddVisualMarker()
。要处理标记上的点击,请使用事件 FastColoredTextBox.VisualMarkerClick
或 Style.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
提供更好的性能。值 VisibleRange
和 AllTextRange
- 提供更准确的高亮(包括多行注释),但会损失性能。
多行注释高亮
如果您的自定义语言支持多行注释或其他多行运算符,您可能会遇到高亮此类运算符的问题。TextChanged
事件中的属性 ChangedRange
仅包含文本的更改范围。但是多行注释比 ChangedRange
大,因此会导致不正确的高亮。您可以通过以下方式解决此问题:在 TextChanged
处理程序中,使用 FastColoredTextBox
的 VisibleRange
或 Range
属性,而不是 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
类型的样式。color
和backColor
确定前景色和背景色。允许使用字符串颜色名称或 #RGB 或 #ARGB 形式的十六进制表示。fontStyle
-FontStyle
参数的枚举。<style>
标签的顺序决定了这些样式的渲染顺序。<rule style="..." options="...">regex pattern</rule>
- 设置高亮规则。style
- 在<style>
标签中描述的样式名称。options
-RegexOptions
参数的枚举。标签内容 - 用于高亮的正则表达式模式。<folding start="..." finish="..." options="...">
- 指定折叠规则。start
和finish
设置块开头和结尾的正则表达式。options
-RegexOptions
参数的枚举。
以下是用于 HTML 语法高亮的 XML 文件示例
<doc>
<brackets left="<" right=">" />
<style name="Maroon" color="Maroon" fontStyle="Bold,Italic" />
<style name="Blue" color="Blue"/>
<style name="Red" color="Red" backColor="#f5f5e5" />
<rule style="Blue"><|/>|</|></rule>
<rule style="Maroon"><(?<range>[!\w\d]+)</rule>
<rule style="Maroon"></(?<range>[\w\d]+)></rule>
<rule style="Red" options="Multiline">(?<range>\S+?)='[^']*
'|(?<range>\S+)="[^"]*"|(?<range>\S+)=\S+</rule>
<folding start="<div" finish="</div>" options="IgnoreCase"/>
</doc>
后退/前进导航
控件会记住用户访问过的行。您可以按 [Ctrl + -] 或调用 NavigateBackward()
返回到上一个位置。同样,[Ctrl + Shift + -] 和方法 NavigateForward()
。
您还可以使用属性 Line.LastVisit
获取上次访问此行的信息。在 PowerfulCSharpEditor
示例中,此属性用于多标签模式下的导航,当您打开多个文档时。
象形文字和宽字符
控件支持输入和显示象形文字及其他宽字符(CJK 语言、阿拉伯语等)。还支持输入法编辑器 (IME)。
要启用此功能,请将属性 ImeMode
切换到 On 状态。
演示包含 IME 功能使用示例。
注意:为了正常显示宽字符,可能需要更大的字体大小。
注意:启用 IME 模式可能会降低控件性能。
自动完成
该库具有 AutocompleteMenu
类,用于实现自动完成功能(例如 IntelliSense 弹出菜单)。
AutocompleteMenu
包含 AutocompleteItem
列表。它支持项目的显示、过滤和插入。
您可以将 AutocompleteMenu
用于代码片段、关键字、方法和属性提示。
请注意 Fragment
、SearchPattern
、MinFragmentLength
、Items.ImageList
、Items.SetAutocompleteItems()
等属性和方法。
您可以重写 AutocompleteItem
类以获得更灵活的功能。
此外,您可以使用更高级的控件 AutocompleteMenu[^]。AutocompleteMenu
与 FastColoredTextBox 完全兼容。
有关更多信息,请参阅 AutocompleteSample
和 AutocompleteSample2
。
自动缩进
当用户输入文本并启用 AutoIndent
时,控件会自动确定输入字符串的左缩进。
默认情况下,缩进根据代码折叠标记进行。但是,如果您选择特定的 Language
,则由集成高亮器为相应语言进行填充。
您可以设置自己的缩进规则。
使用 AutoIndentNeeded
事件。
处理程序必须返回两个值:Shift
和 ShiftNextLines
。
Shift
值表示此行相对于上一行的缩进(以字符为单位,可以为负)。ShiftNextLines
值表示将应用于此行之后后续行的缩进。
图片显示了一些可能的变体
和
AutoIndentNeeded
处理程序的示例显示在 AutoIndentSample 中。
注意:如果您处理 AutoIndentNeeded
事件,内置高亮器的缩进将禁用。
此外,您可以手动对选定文本进行 AutoIndent
。只需调用 DoAutoIndent()
方法。下图显示了调用前后的文本
这是调用 DoAutoIndent()
之后的图片
自动缩进字符
该控件可以对相邻行中的单个字符位置进行对齐。此功能称为 AutoIndentChars。
示例如下
属性 AutoIndentCharsPatterns
包含一组模式(每行一个模式)。
当用户键入字符时,将针对每个模式检查行。如果字符串适合某些模式,则检查附近的行(这些行的左缩进必须与当前行的缩进匹配)。然后,通过插入空格来对齐找到的行中的这些符号。哪些符号将被对齐由正则表达式的命名组定义,组名必须是“range”。请参阅示例
在此示例中,将对齐符号“=”及其后面的文本。
要停用 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
,列模式将关闭。方法 InsertText
和 SelectedText
不会更改选择模式。
如果您想以编程方式启用/禁用选择模式,请使用属性 Selection.ColumnSelectionMode
。
自动换行模式不支持列选择。
书签
该控件内置书签功能。您可以使用属性 Bookmarks
来访问书签。此外,用户可以使用快捷键 Ctrl-B
、Ctrl-Shift-B
、Ctrl-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 版本
![]() |
该控件在 .NET Compact Framework 2.0 下运行。这意味着您可以将其用于移动平台(PocketPC、智能手机、PDA 等)。 CF 版本支持所有功能,但以下除外
其余功能均有,仅与完整版略有不同。 |
示例
演示应用程序有许多示例。下面是简要说明
- 强大示例。包含许多功能:语法高亮、代码折叠、导出、相同单词高亮等。
- 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。示例展示了如何创建自动完成功能
- 工具提示示例。 它显示鼠标下单词的工具提示。
- 动态高亮示例。展示如何进行动态语法高亮。此示例查找程序中声明的函数,并动态高亮它们在 LISP 代码中的所有出现。
- 通过 XML 描述进行语法高亮。 此示例使用 XML 文件描述语法高亮。
- IMEmode 示例。 此示例支持 IME 输入模式和宽字符渲染。
- 图像绘制示例。 示例展示了如何绘制图像而不是文本
此示例也支持动画 GIF。 - 自动缩进示例。 示例展示了如何制作自定义自动缩进功能。
- BookmarksSample. 示例展示了如何制作书签功能。
- Logger 示例。 它展示了如何以预定义样式添加文本
- 拆分示例。 它展示了如何实现分屏模式
- 懒惰加载示例。 它展示了如何处理超大文件。
- 控制台示例。 它展示了如何创建控制台模拟器。
- HintSample. 它展示了如何使用提示。
- ReadOnlySample. 该示例展示了如何创建只读文本块。
- MacrosSample. 此示例展示了如何使用宏进行代码的硬格式化。
- PredefinedStylesSample. 在这里,我们创建带有预定义样式、超链接和工具提示的大型只读文本。
- DocumentMapSample. 展示文档地图功能。
- DiffMergeSample。
- 笑话示例。 它包含一些附加功能,实现了自定义
TextStyle
性能
存储一兆字节的文本大约需要 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 编辑器,发现这些功能不方便。添加了一些方法、事件和属性(
LineInserted
、LineRemoved
、Line.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
的显示。此外,改进了IncreaseIndent
和DecreaseIndent
方法的行为。现在您可以更改内置语法高亮器的配色方案(请参阅属性KeywordStyle
、StringStyle
等)。添加了有用的方法GetStylesOfChar()
。扩展了 SQL 高亮。改进了一些示例。添加了HintSample
示例。现在支持拖放。 - 2013 年 2 月 14 日 - 控件支持只读块、缩放。添加了示例
ReadOnlyBlocksSample
和PredefinedStylesSample
。组件的源代码现在可在 GitHub 上获取。 - 2013 年 2 月 26 日 - 现在支持宏,添加了
MacrosSample
。实现了以下功能:文本区域周围的边框、字符查找。缩进得到了改进。鼠标滚动得到了改进。 - 2013 年 3 月 3 日 - 添加了快捷键映射。现在您可以更改 FTCB 的快捷键。此外,缩放和滚动也得到了改进。
- 2013 年 11 月 7 日 - 添加了文档地图。许多功能得到了改进。
- 2013 年 12 月 13 日 - 添加了 DiffMerge 示例。添加了与 Irony 集成的示例。
- 2013 年 12 月 23 日 - 添加了属性
WordWrapAutoIndent
和WordWrapIndent
。添加了自定义自动换行模式(请参阅示例CustomWordWrappingSample
)。现在支持自定义外部滚动条(请参阅CustomScrollBarSample
)。 - 2014 年 3 月 29 日 - 添加了括号自动完成。添加了带文件编码自动检测的
OpenFile
方法。 - 2014 年 7 月 12 日 - 添加了
AutoIndentChars
功能(详情请参阅文章)。添加了AutoIndentCharsSample
。内置高亮器现在支持Lua
和XML
。 - 2014 年 10 月 25 日 - 添加了 Nuget 包。