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; }
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(); }
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 Aktualisieren des RichTextBox-Textes:
// (Enable repainting) SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); richTextBox.Invalidate();
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!