【问题标题】:RichTextBox flickers while coloring wordsRichTextBox 在为单词着色时闪烁
【发布时间】:2015-05-16 06:42:55
【问题描述】:

我有一个 RichTextBox。

假设我想画出文本中的每个单词“测试”。 我的问题是没有在文本中找到“测试”,我的问题是当我为单词着色时,我可以看到 RichTextBox 选择过程。

我的颜色函数:

Private Sub DrawSubPart(ByVal StartIndex As Integer, ByVal EndIndex As Integer, ByVal col As Color)
    Dim save As Integer = TextScreen.SelectionStart
    TextScreen.SelectionStart = StartIndex                 'Here I can see the selection, And I dont want to see it.
    TextScreen.SelectionLength = EndIndex - EndIndex + 1
    TextScreen.SelectionColor = col
    TextScreen.SelectionLength = 0
    TextScreen.SelectionStart = save
End Sub

我试图捕捉选择过程,它看起来像这样:

一毫秒后它看起来没问题:

那么我怎样才能停止选择“闪烁”?

【问题讨论】:

标签: vb.net text selection richtextbox textselection


【解决方案1】:

尝试使用自定义 RichTextBox 控件,在重新格式化内容时关闭绘图和滚动事件:

Public Class RichTextBoxEx
  Inherits RichTextBox

  <DllImport("user32.dll")> _
  Private Shared Function SendMessage(hWnd As IntPtr, wMsg As Int32, wParam As Int32, ByRef lParam As Point) As IntPtr
  End Function

  <DllImport("user32.dll")> _
  Private Shared Function SendMessage(hWnd As IntPtr, wMsg As Int32, wParam As Int32, lParam As IntPtr) As IntPtr
  End Function

  Const WM_USER As Integer = &H400
  Const WM_SETREDRAW As Integer = &HB
  Const EM_GETEVENTMASK As Integer = WM_USER + 59
  Const EM_SETEVENTMASK As Integer = WM_USER + 69
  Const EM_GETSCROLLPOS As Integer = WM_USER + 221
  Const EM_SETSCROLLPOS As Integer = WM_USER + 222

  Private _ScrollPoint As Point
  Private _Painting As Boolean = True
  Private _EventMask As IntPtr
  Private _SuspendIndex As Integer = 0
  Private _SuspendLength As Integer = 0

  Public Sub SuspendPainting()
    If _Painting Then
      _SuspendIndex = Me.SelectionStart
      _SuspendLength = Me.SelectionLength
      SendMessage(Me.Handle, EM_GETSCROLLPOS, 0, _ScrollPoint)
      SendMessage(Me.Handle, WM_SETREDRAW, 0, IntPtr.Zero)
      _EventMask = SendMessage(Me.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero)
      _Painting = False
    End If
  End Sub

  Public Sub ResumePainting()
    If Not _Painting Then
      Me.Select(_SuspendIndex, _SuspendLength)
      SendMessage(Me.Handle, EM_SETSCROLLPOS, 0, _ScrollPoint)
      SendMessage(Me.Handle, EM_SETEVENTMASK, 0, _EventMask)
      SendMessage(Me.Handle, WM_SETREDRAW, 1, IntPtr.Zero)
      _Painting = True
      Me.Invalidate()
    End If
  End Sub
End Class

那么你的用法是:

RichTextBoxEx1.SuspendPainting()
Dim save As Integer = RichTextBoxEx1.SelectionStart
RichTextBoxEx1.SelectionStart = StartIndex
RichTextBoxEx1.SelectionLength = EndIndex - StartIndex + 1
RichTextBoxEx1.SelectionColor = Color.Green
RichTextBoxEx1.SelectionLength = 0
RichTextBoxEx1.SelectionStart = save
RichTextBoxEx1.ResumePainting()

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2013-03-04
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多