Maison >développement back-end >C++ >Comment puis-je éliminer le scintillement lors de la mise en surbrillance du texte dans une RichTextBox lors d'une saisie en temps réel ?

Comment puis-je éliminer le scintillement lors de la mise en surbrillance du texte dans une RichTextBox lors d'une saisie en temps réel ?

DDD
DDDoriginal
2025-01-05 16:31:44534parcourir

How Can I Eliminate Flickering When Highlighting Text in a RichTextBox During Real-Time Input?

Mise en évidence de la syntaxe étendue pour RichTextBox : désactivation de Repaint pour une saisie sans scintillement

Lorsque vous tapez du texte dans un contrôle RichTextBox, vous pouvez souhaitez mettre en avant des mots-clés spécifiques ou des mots indésirables en temps réel. Pour y parvenir, une fonction est généralement invoquée à chaque frappe, ce qui peut entraîner un scintillement excessif des mots et du curseur.

Dans ce contexte, désactiver le repeint est une solution proposée pour minimiser les distractions visuelles. Une méthode pour ce faire consiste à remplacer la fonction "WndProc" et à intercepter le message de repaint. Cependant, si la fonction que vous utilisez nécessite de transmettre un paramètre RichTextBox, cette approche devient difficile.

Une solution alternative consiste à exploiter les méthodes "BeginUpdate" et "EndUpdate", qui vous permettent de supprimer la peinture et de déclencher une fois que vous avez fini de modifier le texte. Malheureusement, ces méthodes ne sont pas exposées dans la classe RichTextBox.

Pour remédier à cet oubli, vous pouvez ajouter ces méthodes vous-même en créant une classe personnalisée qui hérite de RichTextBox. Collez le code suivant dans une nouvelle classe ajoutée à votre projet :

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;
}

Une fois compilé, déposez le contrôle MyRichTextBox sur votre formulaire depuis la boîte à outils. Alternativement, vous pouvez appeler la fonction SendMessage directement avec le message WM_SETREDRAW avant et après la mise à jour du texte 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn