Как вы препятствуете обновлению RichTextBox своего дисплея?

10
задан JYelton 20 January 2015 в 18:11
поделиться

5 ответов

Я задал исходный вопрос, и ответ, который работал лучше всего на меня, был использованием BoltBait SendMessage () с WM_SETREDRAW. Это, кажется, имеет меньше побочных эффектов, чем использование метода WndProc, и в моем приложении работает дважды с такой скоростью, как LockWindowUpdate.

В моем расширенном классе RichTextBox я просто добавил эти два метода, и я называю их каждый раз, когда я должен остановить перекрашивание перезапуска, в то время как я делаю некоторую обработку. Если бы я желал сделать это от за пределами класса RichTextBox, я думаю, что он работал бы, просто заменив "это" ссылкой на Ваш экземпляр RichTextBox.

    private void StopRepaint()
    {
        // Stop redrawing:
        SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
        // Stop sending of events:
        eventMask = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);
    }

    private void StartRepaint()
    {
        // turn on events
        SendMessage(this.Handle, EM_SETEVENTMASK, 0, eventMask);
        // turn on redrawing
        SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
        // this forces a repaint, which for some reason is necessary in some cases.
        this.Invalidate();
    }
9
ответ дан 3 December 2019 в 18:02
поделиться

Найденный здесь: http://bytes.com/forum/thread276845.html

Я закончил тем, что отправил, WM_SETREDRAW через SendMessage для отключения затем повторно включают сопровождаемый Делением недействительным () после того, как я закончил обновлять. Это, казалось, работало.

Я никогда не пробовал этот метод. Я записал приложение с RTB, который имеет подсветку синтаксиса и использовал следующее в классе RTB:

protected override void WndProc(ref Message m)
{
    if (m.Msg == paint)
    {
        if (!highlighting)
        {
            base.WndProc(ref m); // if we decided to paint this control, just call the RichTextBox WndProc
        }
        else
        {
            m.Result = IntPtr.Zero; // not painting, must set this to IntPtr.Zero if not painting otherwise serious problems.
        }
    }
    else
    {
        base.WndProc(ref m); // message other than paint, just do what you normally do.
    }
}

Надеюсь, это поможет.

3
ответ дан 3 December 2019 в 18:02
поделиться

Вы могли просто сохранить текст в строку, сделать Ваши манипуляции на строке, и в конце метода, сохранить его назад в текстовое свойство?

0
ответ дан 3 December 2019 в 18:02
поделиться

Я предложил бы смотреть на LockWindowUpdate


[DllImport("user32.dll", EntryPoint="LockWindowUpdate", SetLastError=true,
ExactSpelling=true, CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
-1
ответ дан 3 December 2019 в 18:02
поделиться

Испытайте это:

myRichTextBox.SuspendLayout();
DoStuff();
myRichTextBox.ResumeLayout();
-3
ответ дан 3 December 2019 в 18:02
поделиться
Другие вопросы по тегам:

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