Maison >développement back-end >C++ >Comment puis-je optimiser la repeinture de RichTextBox pour la mise en évidence de la syntaxe en temps réel ?
Désactivation de Repaint pour la mise en évidence de la syntaxe RichTextBox en temps réel
Dans certains scénarios de programmation, vous devrez peut-être mettre en surbrillance dynamique des mots-clés ou des mots spécifiques dans un RichTextBox au fur et à mesure que l'utilisateur tape. Cependant, repeindre constamment peut provoquer un scintillement et un inconfort lors de la saisie.
Pour améliorer l'expérience utilisateur, vous pouvez désactiver la repeinture automatique de RichTextBox pendant que vous modifiez son texte. Malheureusement, la classe RichTextBox standard ne fournit pas de méthodes intégrées pour cela.
Personnalisation de RichTextBox avec une classe externe
Une solution consiste à créer une classe RichTextBox personnalisée cela ajoute la fonctionnalité manquante. Voici un exemple :
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; }
Vous pouvez ensuite utiliser les méthodes BeginUpdate() et EndUpdate() dans votre fonction personnalisée qui met en évidence les mots-clés en temps réel :
void HighlightKeywords(MyRichTextBox richTextBox) { richTextBox.BeginUpdate(); // Highlight keywords and bad words richTextBox.EndUpdate(); }
Directement Contrôler Repaint à l'aide de P/Invoke
Vous pouvez également contourner l'utilisation d'une classe personnalisée et contrôler directement repeindre en utilisant la méthode SendMessage avec le message WM_SETREDRAW.
Avant de mettre à jour le texte de la RichTextBox :
[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);
Après la mise à jour du texte de la RichTextBox :
// (Enable repainting) SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); richTextBox.Invalidate();
Cette approche vous permet pour obtenir le même résultat sans modifier la classe standard RichTextBox.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!