"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo eliminar el parpadeo de RichTextBox al resaltar la sintaxis?

¿Cómo eliminar el parpadeo de RichTextBox al resaltar la sintaxis?

Publicado el 2025-04-17
Navegar:927

How to Eliminate RichTextBox Flickering During Syntax Highlighting?

Disable Repaint para RichTextBox sintaxis resaltando

al realizar una sintaxis resaltando en un richTextBox durante la entrada del usuario, resolver el flujo requiere deshabilitar la reproducción. Solución

La solución actual implica anular la función "wndproc" para interceptar y suprimir los mensajes de repintado. Sin embargo, este enfoque no es práctico para funciones externas que trabajan con un richtextBox provisto.

superando el supervisión

un enfoque más efectivo es agregar los métodos de inicio y endupdate faltantes a la clase RichTextBox. Estos métodos generan el mensaje wm_setredraw para suprimir la repasenting.

agregando los métodos

crea una nueva clase en su proyecto con el siguiente código:

usando el sistema; usando System.Windows.Forms; usando System.Runtime.inTeropServices; clase 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; }

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

Ahora puede usar estos métodos para deshabilitar y habilitar la repasenting dentro de su sintaxis resaltando la función.

Solución alternativa

[&] si agrega los métodos a la clase no es posible, usted también puede usar el SendedMesge ". directamente antes y después de actualizar el texto.

sendMessage (this.handle, wm_setredraw, (intptr) 0, intptr.zero); // deshabilitar el repintado // Actualizar texto SendMessage (this.handle, wm_setredraw, (intptr) 1, intptr.zero); // habilitar repintando this.Invalidate ();

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3