Подсветка синтаксиса RichTextBox в реальном времени - отключение перерисовки

13
задан Robz 20 July 2010 в 02:19
поделиться

2 ответа

Это недосмотр в классе RichTextBox. Другие элементы управления, такие как ListBox, поддерживают методы BeginUpdate и EndUpdate для подавления рисования. Эти методы генерируют сообщение WM_SETREDRAW. RTB фактически поддерживает это сообщение, но они забыли добавить методы.

Просто добавьте их сами. Project + Add Class, вставьте код, показанный ниже. Скомпилируйте и перетащите элемент управления из верхней части панели инструментов в форму.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class MyRichTextBox : RichTextBox {
    public void BeginUpdate() {
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
    }
    public void EndUpdate() {
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
        this.Invalidate();
    }
    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    private const int WM_SETREDRAW = 0x0b;
}

Или P / Invoke SendMessage непосредственно до / после обновления текста.

25
ответ дан 1 December 2019 в 20:10
поделиться

Лучше всего, чтобы выполнить то, что вы пытаетесь сделать, - это создать многопоточное приложение. Вы захотите создать одну ветку, которая проверяет текст по вашему списку. Этот поток помещает все найденные экземпляры в очередь. Вы также захотите создать еще один поток, который будет выделять слова. Поскольку вам нужно будет использовать BeginInvoke () и Invoke () для обновления пользовательского интерфейса, вам нужно убедиться, что вы регулируете скорость, с которой это вызывается. Я бы так не больше 20 раз в секунду. Для этого вы должны использовать такой код:

DateTime lastInvoke=DateTime.Now;

if ((DateTime.Now - lastInvoke).TotalMilliseconds >=42)
{
    lastInvoke=DateTime.Now;
    ...Do your highlighting here...
}

Этот поток будет проверять вашу очередь на наличие слов, которые необходимо выделить или повторно выделить, и будет постоянно проверять очередь на наличие новых обновлений. Надеюсь, это имеет смысл!

0
ответ дан 1 December 2019 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: