Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何在Richtextbox后面绘制高光_Vb.net_Richtextbox - Fatal编程技术网

Vb.net 如何在Richtextbox后面绘制高光

Vb.net 如何在Richtextbox后面绘制高光,vb.net,richtextbox,Vb.net,Richtextbox,使用此代码,它会在文本上绘制高光,这会使文本模糊吗 Public Class HighlightableRTB Inherits RichTextBox Private LineHeight As Integer = 15 Public Sub New() HighlightColor = Color.Yellow End Sub <Category("Custom"), Description("Specifies the highlight

使用此代码,它会在文本上绘制高光,这会使文本模糊吗

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
公共类HighlightableRTB
继承RichTextBox
专用线宽为整数=15
公共分新()
HighlightColor=颜色。黄色
端接头
公共属性HighlightColor作为颜色
选择更改时受保护的覆盖子项(将值e作为事件参数)
MyBase.OnSelectionChanged(e)
使无效
端接头
私有常量WM_PAINT为整数=15
受保护的覆盖子WndProc(ByRef m作为消息)
如果m.Msg=WM_油漆,则
Dim selectLength=Me.SelectionLength
Dim selectStart=Me.SelectionStart
使无效
MyBase.WndProc(m)
如果选择长度>0,则返回
使用g作为Graphics=Graphics.FromHwnd(Me.Handle)
作为笔刷的调暗b=新的SolidBrush(颜色为argB(50,高亮颜色))
Dim line=Me.GetLineFromCharIndex(选择开始)
Dim loc=Me.GetPositionFromCharIndex(Me.GetFirstCharIndexFromLine(行))
g、 FillRectangle(b,新矩形(loc,新尺寸(Me.Width,LineHeight)))
终端使用
其他的
MyBase.WndProc(m)
如果结束
端接头
末级

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

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

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

你可以画文本。。。在课文上。它不会删除已经存在的文本。。。但是在它上面画画。如果你的坐标有点偏离,看起来会很糟糕,但是如果你找到了准确的位置,它会像一个符咒一样工作。一种可怕的、粗俗的魅力:

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%的黑客行为,我当然希望有人比我更有理智。我写的位置(-2,1)应该可以做到这一点,但是如果它不起作用,你可以通过替换
Color.FromArgb(50,HighlightColor)
by
Color.FromArgb(255,HighlightColor)
来消除透明度以隐藏你的羞耻感。它不会那么明显,因为只有当有人选择它时,文本才会显示这个肮脏的把戏(试试!)


玩得开心

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

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

你可以画文本。。。在课文上。它不会删除已经存在的文本。。。但是在它上面画画。如果你的坐标有点偏离,看起来会很糟糕,但是如果你找到了准确的位置,它会像一个符咒一样工作。一种可怕的、粗俗的魅力:

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%的黑客行为,我当然希望有人比我更有理智。我写的位置(-2,1)应该可以做到这一点,但是如果它不起作用,你可以通过替换
Color.FromArgb(50,HighlightColor)
by
Color.FromArgb(255,HighlightColor)
来消除透明度以隐藏你的羞耻感。它不会那么明显,因为只有当有人选择它时,文本才会显示这个肮脏的把戏(试试!)


玩得开心

突出显示不在当前插入符号行之后。它在画所有的东西。此外,绘制的文本并没有放入实际的文本,而这些文本在向下滚动时应该位于突出显示的位置。我真正想要的是Notepad++中的那种类型,你知道它绘制当前行的背景,即插入符号,而文本仍然保持清晰。因此,如果有任何其他方法来实现这一点,我将不胜感激。这是因为我修改了这一部分:
新的大小(Me.Width,Me.Lines.Count*LineHeight)
所以每一行都是黄色的。您的原始代码只绘制了第一行。我正在用一些新值和图像更新代码段。这解决了您的问题吗?如果你修正了另一种方法,你也可以发布你自己的答案,因为它可能对未来有类似问题的用户有用。突出显示的内容没有跟随当前插入符号行。它在画所有的东西。此外,绘制的文本并没有放入实际的文本,而这些文本在向下滚动时应该位于突出显示的位置。我真正想要的是Notepad++中的那种类型,你知道它绘制当前行的背景,即插入符号,而文本仍然保持清晰。因此,如果有任何其他方法来实现这一点,我将不胜感激。这是因为我修改了这一部分:
新的大小(Me.Width,Me.Lines.Count*LineHeight)
所以每一行都是黄色的。您的原始代码只绘制了第一行。我正在用一些新值和图像更新代码段。这解决了您的问题吗?如果你修正了另一种方法,你也可以发布你自己的答案,因为它可能对未来有类似问题的用户有用。