0

因此,我正在尝试创建一个或两个函数,该函数采用 html 标记并将它们的颜色与文本的其余部分不同(类似于 Visual Studio 对诸如 之类的关键字的处理方式Dim)。我发现的唯一方法是使用富文本框,然后 do*.SelectionColor = Color.Blue或类似的东西。有没有其他方法可以做到这一点?我这样做了,每当文本框更新时,它都会读取它,并将所有 html 标记更改为不同的颜色。这适用于一个非常短的 html 文件,但是当它们变得更大时,它会花费太长时间,并且选择会移动光标。

那么,有没有其他方法可以做到这一点,即使我必须使用富文本框以外的东西?如果没有,有没有人看到改善这一点的方法?

这是文本框更新时运行的两个函数。标签为蓝色,属性为红色,引号中的内容为绿色。

    '//////////////////////////////////////////////////////////////////////////
    '// findTag()
    '// -finds a tag
    '//////////////////////////////////////////////////////////////////////////
    Private Function findTag()
        Dim tag As String = ""
        Dim i As Integer = 0
        Dim startTag As Integer

        While (i < txtCurrentFile.TextLength - 1)
            If txtCurrentFile.Text(i) = "<" Then
                startTag = i
                While txtCurrentFile.Text(i) <> ">"
                    tag += txtCurrentFile.Text(i)
                    i += 1
                End While
                tag += ">"
                colorCode(startTag, tag)
                tag = ""
            End If
            i += 1
        End While
        Return Nothing
    End Function

    '//////////////////////////////////////////////////////////////////////////
    '// colorCode()
    '// -colors different tags accordingly
    '//////////////////////////////////////////////////////////////////////////
    Private Function colorCode(ByVal startIndex As Integer,
                               ByVal tag As String)
        Dim i As Integer = 0
        Dim isAttributes As Boolean = False
        Do While (tag(i) <> " " And tag(i) <> ">")
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
            i += 1
        Loop

        If i < tag.Length Then
            Do Until (tag(i) = ">")
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Red
                    i += 1
                Loop
                i += 1
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Purple
                    i += 1
                Loop
                i += 1
            Loop
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
        End If
        Return Nothing
    End Function
4

2 回答 2

3

几点建议:

  1. 放弃字符扫描仪。用任何速度更快的东西(RegEx,HTML Agility Pack,...)替换它

  2. 如果您真的想保留字符扫描器,则将扫描限制在修改周围的区域(例如,光标前后 200 个字符)

  3. 在开始颜色处理之前记住光标所在的位置,并在完成后恢复它。

  4. 实现一个背景着色器,它在单独的线程上对完整的文件重新着色(您必须克隆 RTB,并且只有在着色器运行时用户没有进行任何更改时才应用更改)。

于 2013-03-14T18:34:34.043 回答
2

...我不知道这是否会起作用!!!,但如果它确实会很酷...

也许在 webbrowser 控件中打开文件并在 css 表中设置您的着色规则?

同样,我不知道这是否是一个好主意,但它可能会很好地解决问题,因为它已经是你正在处理的 HTML ......

于 2013-03-14T18:41:31.970 回答