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

IRTB2

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2013年1月4日

LGPL3

5分钟阅读

viewsIcon

29590

downloadIcon

413

这是“改进的富文本框 - IRTB”的替代方案。2.3版本已发布!终于加入了一些正则表达式修复和用于缩进的Alpha版本!

下载 源代码和DLL 

简介

这是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)) 

    它们可能不好。 

  • 没有丢失原始RTB的属性/子程序。 

使用控件。 

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   

我们获取当前行第一个字符的索引,用于两个操作。行是通过从字符索引获取一行来计算的。要获取列,我们将选区的开始位置减去字符索引。

结果将比实际值少一,所以最后将结果值再加一。 

要获取它,你不需要调用GetLineCol() 使用LineCollumn属性,它们会返回这些值。

缩进

自动缩进尚不支持。感谢创建互联网的人,让我可以出去在2.4或2.5版本中发布它。 

它只是为选区添加(长度)个空格,因为它会出错。只需调用CreateIdentRemoveIdent。  

2.3版本中的新属性  

属性  描述 
行  获取当前行 
列  获取当前列 
DefaulCharOffset  四个预定义的CharOffset值。  

FileNameInfo  

可以存储和检索文件名。  

IsSyntaxEnabled 

定义语法高亮方法是否工作 


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

  • 修复了正则表达式高亮。
  • 添加了ChangedFileNameInfo属性|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"。 
  • 一些无用的共享方法已改为仅实例。这对我来说非常烦人。影响了HighlightCommentsClearHighlight。 
  •  缩进“预alpha-alpha”已添加。
  • 修复了当前行高亮范围(视图,哦天哪。我仍然无法解决它)。
  • ClearHighlight()方法现在可以与HighlightRange关联,因此你现在可以使用Range CurrentLine而不丢失先前高亮显示的行。 

预览:      

2.0   

 

2.1 '精确性'  

2.2 正则表达式  

 

2.3 哦,抱歉

 

下载者须知:  

 由于我由于循环依赖bug而重启了项目,所以有两个DLL,123.dll和IRT B2.dll。 

显然,选择IRT B2.dll。那是正确的DLL。   

即将推出

新手指南。 

IRT B2 - CodeProject - 代码之家
© . All rights reserved.