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 ?

Comment puis-je optimiser la repeinture de RichTextBox pour la mise en évidence de la syntaxe en temps réel ?

DDD
DDDoriginal
2025-01-06 03:01:401004parcourir

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

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!

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