2012-02-23 19 views
5

Tengo un richTextBox que estoy usando para realizar algunos resaltados de sintaxis. Se trata de una pequeña instalación de edición así que no he escrito un resaltador de sintaxis personalizada - en vez estoy usando Regex s y actualizar en la detección de un retardo de entrada utilizando un controlador de eventos para el Application.Idle evento:RichTextBox BeginUpdate() EndUpdate() Métodos de extensión que no funcionan

Application.Idle += new EventHandler(Application_Idle); 

en caso manejador puedo comprobar por el momento el cuadro de texto ha estado inactivo:

private void Application_Idle(object sender, EventArgs e) 
{ 
    // Get time since last syntax update. 
    double timeRtb1 = DateTime.Now.Subtract(_lastChangeRtb1).TotalMilliseconds; 

    // If required highlight syntax. 
    if (timeRtb1 > MINIMUM_UPDATE_DELAY) 
    { 
     HighlightSyntax(ref richTextBox1); 
     _lastChangeRtb1 = DateTime.MaxValue; 
    } 
} 

Pero incluso relativamente pequeños aspectos más destacados de la RichTextBox parpadea en gran medida y no tiene richTextBox.BeginUpdate()/EndUpdate() métodos. Para superar este encontré this answer to a similar dilemma by Hans Passant (Hans Passant nunca me ha defraudado!):

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

    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    private const int WM_SETREDRAW = 0x0b; 
} 

Sin embargo, esto me da un comportamiento extraño en una actualización; el cursor muere/se congela y no muestra más que rayas de aspecto extraño (ver imagen a continuación).

Odd Error Caused by RichTextBox Method Extension

que claramente no puedo utilizar un hilo alternativa para actualizar la interfaz de usuario, así que lo que estoy haciendo mal aquí?

Gracias por su tiempo.

Respuesta

7

Intente modificar el EndUpdate para llamar también Invalidar después. El control no sabe que necesita hacer algunas actualizaciones, por lo que necesita contarlo:

public void EndUpdate() 
{ 
    SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
    this.Invalidate(); 
} 
+0

¡Eso es menta! Funcionó como un amuleto ... Una pequeña pregunta, ¿cómo se puede aprender sobre los métodos de extensión y sus sutilezas? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);' no es exactamente el estándar C# !? ¿O es eso? – MoonKnight

+1

@Killercam 'SendMessage' y Extensions son dos cosas diferentes. 'SendMessage' llama a una función API de Windows. Para extensiones, vea [Métodos de extensión (Guía de programación C#)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech

+0

Gracias por su respuesta. Me doy cuenta de que los dos son diferentes. Gracias por el enlace y su ayuda, es muy apreciado. – MoonKnight

Cuestiones relacionadas