Heim > Backend-Entwicklung > C++ > Wie kann ich das RichTextBox-Repainting für die Syntaxhervorhebung in Echtzeit optimieren?

Wie kann ich das RichTextBox-Repainting für die Syntaxhervorhebung in Echtzeit optimieren?

DDD
Freigeben: 2025-01-06 03:01:40
Original
1037 Leute haben es durchsucht

How Can I Optimize RichTextBox Repainting for Real-Time Syntax Highlighting?

Repaint für RichTextBox-Syntaxhervorhebung in Echtzeit deaktivieren

In bestimmten Programmierszenarien müssen Sie möglicherweise Schlüsselwörter oder bestimmte Wörter in einem dynamisch hervorheben RichTextBox, wie der Benutzer eingibt. Ständiges Neuzeichnen kann jedoch zu Flackern und Unbehagen bei der Eingabe führen.

Um das Benutzererlebnis zu verbessern, können Sie das automatische Neuzeichnen der RichTextBox deaktivieren, während Sie den Text bearbeiten. Leider bietet die Standard-RichTextBox-Klasse hierfür keine integrierten Methoden.

Anpassen von RichTextBox mit einer externen Klasse

Eine Lösung besteht darin, eine benutzerdefinierte RichTextBox-Klasse zu erstellen das fügt die fehlende Funktionalität hinzu. Hier ist ein Beispiel:

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;
}
Nach dem Login kopieren

Sie können dann die Methoden BeginUpdate() und EndUpdate() in Ihrer benutzerdefinierten Funktion verwenden, die Schlüsselwörter in Echtzeit hervorhebt:

void HighlightKeywords(MyRichTextBox richTextBox) {
    richTextBox.BeginUpdate();

    // Highlight keywords and bad words

    richTextBox.EndUpdate();
}
Nach dem Login kopieren

Direkt Repaint mit P/Invoke steuern

Alternativ können Sie dies mithilfe einer benutzerdefinierten Klasse umgehen und Repaint direkt steuern Verwenden der SendMessage-Methode mit der WM_SETREDRAW-Nachricht.

Vor dem Aktualisieren des RichTextBox-Textes:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
const int WM_SETREDRAW = 0x0b;

// (Disable repainting)
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
Nach dem Login kopieren

Nach dem Aktualisieren des RichTextBox-Textes:

// (Enable repainting)
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
richTextBox.Invalidate();
Nach dem Login kopieren

Dieser Ansatz ermöglicht es Ihnen Erzielen Sie das gleiche Ergebnis, ohne die Standard-RichTextBox-Klasse zu ändern.

Das obige ist der detaillierte Inhalt vonWie kann ich das RichTextBox-Repainting für die Syntaxhervorhebung in Echtzeit optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage