【问题标题】:How to Draw Highlight Behind Richtextbox如何在 Richtextbox 后面画高亮
【发布时间】:2020-12-06 21:48:33
【问题描述】:

使用此代码,它在文本上绘制突出显示,这会使文本以某种方式模糊?

Public Class HighlightableRTB
Inherits RichTextBox

Private LineHeight As Integer = 15

Public Sub New()
    HighlightColor = Color.Yellow
End Sub

<Category("Custom"), Description("Specifies the highlight color.")>
Public Property HighlightColor As Color

Protected Overrides Sub OnSelectionChanged(ByVal e As EventArgs)
    MyBase.OnSelectionChanged(e)
    Me.Invalidate()
End Sub

Private Const WM_PAINT As Integer = 15

Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_PAINT Then
        Dim selectLength = Me.SelectionLength
        Dim selectStart = Me.SelectionStart
        Me.Invalidate()
        MyBase.WndProc(m)
        If selectLength > 0 Then Return

        Using g As Graphics = Graphics.FromHwnd(Me.Handle)
            Dim b As Brush = New SolidBrush(Color.FromArgb(50, HighlightColor))
            Dim line = Me.GetLineFromCharIndex(selectStart)
            Dim loc = Me.GetPositionFromCharIndex(Me.GetFirstCharIndexFromLine(line))
            g.FillRectangle(b, New Rectangle(loc, New Size(Me.Width, LineHeight)))
        End Using
    Else
        MyBase.WndProc(m)
    End If
End Sub
End Class

如何在richtextbox的文本后面绘制矩形高亮?

【问题讨论】:

    标签: vb.net richtextbox


    【解决方案1】:

    正如您已经猜到的那样,文本并不是真的“模糊”......它是画在它上面的黄色矩形使它看起来像这样。

    这并不容易。事实上,我有一个解决方案,但这不是我推荐的……如果我还有什么要说的话。但我没有,所以这里有一种处理这个问题的方法:

    您可以在文本上绘制文本...。它不会删除已经存在的文本......但会在其上绘制。如果你的坐标有点偏离,它看起来像废话,但如果你找到了正确的位置,它会像一个魅力一样工作。一个可怕的,骇人听闻的魅力:

    Using g As Graphics = Graphics.FromHwnd(Me.Handle)
        Dim b As Brush = New SolidBrush(Color.FromArgb(50, HighlightColor))
        Dim line = Me.GetLineFromCharIndex(Me.SelectionStart)
        Dim loc = Me.GetPositionFromCharIndex(Me.GetFirstCharIndexFromLine(line))
        g.FillRectangle(b, New Rectangle(loc, New Size(Me.Width, LineHeight)))
        TextRenderer.DrawText(g, Me.Text, Font, New Point(-2, 1), ForeColor) ' this is the important line!
    End Using
    

    不过,这 100% 是一个 hack,我当然希望比我更有理智的人加入。我写的位置 (-2, 1) 应该可以解决问题,但如果不知何故,你可以通过将Color.FromArgb(50, HighlightColor) 替换为Color.FromArgb(255, HighlightColor) 来消除透明度以隐藏您的羞耻。它不会那么明显,因为只有当有人选择它时,文本才会显示这个肮脏的把戏(试试吧!)。

    玩得开心!

    【讨论】:

    • 高亮没有跟随当前的插入符号行。它在画一切。此外,绘制的文本并没有放入向下滚动时假设处于突出显示的实际文本。我真正想要的是 Notepad++ 中的那种类型,你知道它描绘了插入符号所在的当前行的背景,而文本仍然保持清晰。因此,如果有任何其他方法可以实现这一目标,我将不胜感激。
    • 那是因为我修改了这部分:New Size(Me.Width, Me.Lines.Count * LineHeight) 所以每一行都是黄色的。您的原始代码仅绘制第一行。我正在用一些新值和图像更新代码 sn-p。
    • 这是否解决了您的问题?如果您修复了其他方式,您也可以发布自己的答案,因为它可能对未来遇到类似问题的用户有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2011-08-24
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多