2015-03-13 2 views
1

У меня есть RichTextBox.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 

Я попытался поймать процесс выбора и выглядеть:

enter image description here

И после одной миллисекунды она выглядит нормально:

enter image description here

Итак, как я могу остановить выделение «мерцание»?

+0

Если вы собираетесь использовать это как синтаксический ярлык, я предлагаю вместо этого использовать ScintillaNET: https://scintillanet.codeplex.com/ –

ответ

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() 
+0

отлично работает, tnx –

Смежные вопросы