IRTB2
这是“改进的富文本框 - IRTB”的替代方案。2.3版本已发布!终于加入了一些正则表达式修复和用于缩进的Alpha版本!
简介
这是Juan的IRT B的修改版本。它是一个继承RichTextBox的类,其中包含我在网上找到的许多代码。
主要的修改是支持语法高亮。在此版本中,我修复了语法高亮问题,并为Python和Batch添加了默认的语法定义
背景
为什么IRTB2有用?
- 因为它提供的功能可以帮助任何人在标签文本编辑器中工作。
- 易于使用(语法高亮可能有点难。即使我在测试时,我也遇到了自己创建的难题:P)
- 结合了语法高亮和优秀的文本编辑器的两个梦想。
与IRT B有什么区别?
Changed
属性使得使用TextChanged
事件来设置变量为true或false变得没有必要。LineNumberPictureBox
代替了UserControl中的PB。FileNameInfo
属性用于存储和检索文件名。- 语法高亮子程序(显而易见。)它们是共享的,所以...
RegexHighlinghting.HighlightKeyWordRegex(CType(TabControl1.SelectedTab.Controls.Item(0), IRTBTwo), c, cz(0))
RegexHighlighting.HighlightKeyWordRegex(CType(TabControl1.SelectedTab.Controls.Item(0), IRTBTwo), c2, cz(1))
它们可能不好。
使用控件。
IRT B2的功能:
语法高亮(现在是我的了。我修复了一个在其他单词中间高亮单词的bug,通过创建一个全新的子程序。)
行和列(Juan的)
行号(Juan的。我创建了一个选项,可以使当前行以不同的画笔高亮显示。 )
IRTB2
语法高亮
我修复了正则表达式高亮的问题。缩小并改进了子程序!
Public Shared Sub HighlightKeyWordRegex(ByVal irtb2 As IRTBTwo, _
ByVal words As List(Of String), ByVal color As Color, Optional ByVal useBlack As Boolean = True, _
Optional ByVal HighlightRange As HighlightRange = HighlightRange.All)
'Is syntax enabled?
If irtb2.IsSyntaxEnabled Then
'LIST IS NULL?
If Not words Is Nothing Then
'store pos
Dim pos As Int32 = irtb2.SelectionStart
'store old color\DFC
Dim oldc As Color = irtb2.SelectionColor
If useBlack Then
oldc = Drawing.Color.Black
End If
'store line to prevent problem with range c. line.
Dim cline As Integer = irtb2.GetLineFromCharIndex(irtb2.GetFirstCharIndexOfCurrentLine)
Dim start As Integer = irtb2.GetFirstCharIndexOfCurrentLine
'Before anything, lock to no *evil* flick
IRTBTwo.LockWindowUpdate(irtb2.Handle)
For Each word As String In words
If HighlightRange = HighlightRange.All Then
Dim x As MatchCollection = New Regex(word.ToUpper).Matches(irtb2.Text.ToUpper)
For Each Match As Match In x
irtb2.Find(word, Match.Index, RichTextBoxFinds.WholeWord)
irtb2.SelectionColor = color
irtb2.DeselectAll()
irtb2.SelectionStart = pos
irtb2.SelectionColor = oldc
Next
ElseIf HighlightRange = HighlightRange.CurrentLine Then
Dim x As MatchCollection = New Regex(word.ToUpper).Matches(irtb2.Lines(cline).ToUpper)
For Each Match As Match In x
irtb2.Find(word, start + Match.Index, RichTextBoxFinds.WholeWord)
irtb2.SelectionColor = color
irtb2.DeselectAll()
irtb2.SelectionStart = pos
irtb2.SelectionColor = oldc
Next
ElseIf HighlightRange = HighlightRange.View Then
Dim i As Integer = irtb2.GetFirstVisibleLine
Dim x As MatchCollection
Do While i < irtb2.GetLastVisibleLine
x = New Regex(word.ToUpper).Matches(irtb2.Lines(i).ToUpper)
For Each Match As Match In x
irtb2.Find(word, irtb2.GetFirstCharIndexFromLine(i) + _
Match.Index, RichTextBoxFinds.WholeWord)
irtb2.SelectionColor = color
irtb2.DeselectAll()
irtb2.SelectionStart = pos
irtb2.SelectionColor = oldc
Next
i += i
Loop
End If
Next
'Free to evil, flick!
IRTBTwo.LockWindowUpdate(IntPtr.Zero)
Dim E As New SyntaxHighlightingEventArgs(irtb2, _
SyntaxHighlightingEventArgs.SyntaxMethods.Regex)
irtb2.OnSyntaxApplied(E)
End If
End If
End Sub
这样,你将提供一个IRT B2,一个单词列表,以及一种颜色。
此例程,位置和旧颜色被存储,Win32 API调用可以避免闪烁(我亲眼所见)。然后它将查找每个匹配项作为整个单词,为其着色。然后,旧的位置和颜色将被恢复。然后闪烁就会消失。
无论如何,我们来看一个快速教程。
很简单。(IRT B2将被称为IrtbTwo1
。)
注释:
列表不应为null。它会损坏控件。 为了防止这种情况,我在代码中添加了一个null检查。
如果你想要两种或更多种高亮颜色,你需要多次调用HighlightKeyWordRegex
(我拼错了s)。
Dim c As New List(Of String)
Dim c2 As New List(Of String)
Dim cz As Color() = {Color.Blue, Color.Purple}
Private Sub ds()
On Error GoTo ex
IRTBTwo.ClearHighlight(IrtbTwo1)
IRTBTwo.HighlightComments(CType(TabControl1.SelectedTab.Controls.Item(0), IRTBTwo), c, cz(0))
RegexHighlighting.HighlightKeyWordRegex(CType(TabControl1.SelectedTab.Controls.Item(0), IRTBTwo), c, cz(0))
RegexHighlighting.HighlightKeyWordRegex(CType(TabControl1.SelectedTab.Controls.Item(0), IRTBTwo), c2, cz(1))
ex:
Exit Sub
首先,我们将清除所有彩色文本,包括不精确的语法高亮。
我们有两个列表(它们的内容在其他地方定义)。有一个颜色数组,每个列表对应一种颜色。
然后我们调用它两次,就可以实现双重颜色!
获取行和列
这是行0列0的固定代码。
Dim GetFirstCharIndex As Integer = Me.GetFirstCharIndexOfCurrentLine
Dim GetRTBLine = Me.GetLineFromCharIndex(GetFirstCharIndex)
Dim GetPosition As Integer = Me.SelectionStart - GetFirstCharIndex
GetPosition = GetPosition + 1
GetRTBLine = GetRTBLine + 1
Dim x As Integer() = {GetRTBLine, GetPosition}
Return x
我们获取当前行第一个字符的索引,用于两个操作。行是通过从字符索引获取一行来计算的。要获取列,我们将选区的开始位置减去字符索引。
结果将比实际值少一,所以最后将结果值再加一。
要获取它,你不需要调用GetLineCo
l()
。 使用Line
和Collumn
属性,它们会返回这些值。
缩进
自动缩进尚不支持。感谢创建互联网的人,让我可以出去在2.4或2.5版本中发布它。
它只是为选区添加(长度)个空格,因为它会出错。只需调用CreateIdent
或RemoveIdent
。
2.3版本中的新属性
属性 | 描述 |
行 | 获取当前行 |
列 | 获取当前列 |
DefaulCharOffset | 四个预定义的CharOffset值。 |
|
可以存储和检索文件名。 |
| 定义语法高亮方法是否工作 |
LineNumberPictureBox
它的基本用途是绘制行号。
你也可以设置背景色。
好吧,因为它在使用时通常会抛出NullRefEx,让我解释一下如何使用它。
如何正确使用:
将L.N.P.B.添加到你的窗体。它通常会抛出NullRefEx
。将MyIRTB
设置为想要的IRTB2
。如果仍然出现NullRefEx
,请关闭并再次打开设计器。在需要时调用Ready()
来绘制行号。
IRTB2TabItem
无用。它只是一个带有IRT B2的TabPage。你仍然需要使用CType
。
关注点
我发现了一个规则:**永远**不要这样做IRT.IRT B,SuperApp.SuperApp。每次编译时,你都需要更改。
Global.IRTB.IRTB
Global.SuperApp.SuperApp
永远不要过度使用Invalidate()
:你的应用程序会看起来很糟糕。
Ctrl + Backspace = 超快速退格
历史
世界末日 - v1.0
2013年1月3日 - 2.0
- 修复了正则表达式高亮。
- 添加了
Changed
、FileNameInfo
属性|LNPB、IRT B2TI控件。
2013年1月7日 - 2.1 '精确性'
- -支持注释(beta)。可以设置
CommentPrefix
(例如'或//)和CommentColor
(例如绿色)并调用HighlightComments()
。 - -通过
ClearHighlight()
方法实现更精确的语法高亮。这是通过将所有文本变为黑色并调用高亮方法来完成的。
2013年1月12日 - 2.2 '正则表达式
- 完全支持注释(<KnownIssue>HTML无效。</KnownIssue>
- 添加了默认定义(
DefaultDefs
类) - 添加了
RegexHighlighting
类。HighlightKeyWordRegex
已移至此处。还有一个HighlightPattern
类,用于高亮显示旧的正则表达式模式。 HighlightPattern
的值只能在构造函数中设置。
2013年9月10日 - 2.3 '哦,抱歉!
- 学习Python和Java推迟了我的工作。
- 为Python和Batch添加了默认定义。
Find()
在RichTextBox中的原生方法因bug已被替换为真正的正则表达式。现在它使用正则表达式"\b & wordinlist & \b"。- 一些无用的共享方法已改为仅实例。这对我来说非常烦人。影响了
HighlightComments
和ClearHighlight
。 - 缩进“预alpha-alpha”已添加。
- 修复了当前行高亮范围(视图,哦天哪。我仍然无法解决它)。
ClearHighlight()
方法现在可以与HighlightRange
关联,因此你现在可以使用RangeCurrentLine
而不丢失先前高亮显示的行。
预览:
2.0
2.1 '精确性'
2.2 正则表达式
2.3 哦,抱歉
下载者须知:
由于我由于循环依赖bug而重启了项目,所以有两个DLL,123.dll和IRT B2.dll。
显然,选择IRT B2.dll。那是正确的DLL。
即将推出
新手指南。