Maison > développement back-end > C++ > Comment éliminer le scintillement de RichTextBox lors de la mise en évidence de la syntaxe ?

Comment éliminer le scintillement de RichTextBox lors de la mise en évidence de la syntaxe ?

Patricia Arquette
Libérer: 2025-01-06 02:52:40
original
364 Les gens l'ont consulté

How to Eliminate RichTextBox Flickering During Syntax Highlighting?

Désactivation de la coloration syntaxique pour la mise en évidence de la syntaxe RichTextBox

Lors de la mise en évidence de la syntaxe dans une RichTextBox lors de la saisie de l'utilisateur, la résolution du scintillement nécessite la désactivation de la repeinture.

Actuellement inefficace Solution

La solution actuelle consiste à remplacer la fonction "WndProc" pour intercepter et supprimer les messages de repeinture. Cependant, cette approche n'est pas pratique pour les fonctions externes travaillant avec une RichTextBox fournie.

Surmonter la surveillance

Une approche plus efficace consiste à ajouter les méthodes BeginUpdate et EndUpdate manquantes. à la classe RichTextBox. Ces méthodes génèrent le message WM_SETREDRAW pour supprimer le repainting.

Ajout des méthodes

Créez une nouvelle classe dans votre projet avec le code suivant :

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;
}
Copier après la connexion

Utilisation

Vous pouvez désormais utiliser ces méthodes pour désactiver et activez la repeinture dans votre fonction de coloration syntaxique.

Solution alternative

Si l'ajout des méthodes à la classe n'est pas possible, vous pouvez également utiliser le P/Invoke "SendMessage" fonctionner directement avant et après la mise à jour du texte.

SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); // Disable repainting
// Update text
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); // Enable repainting
this.Invalidate();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal