2012-02-23 8 views
5

Mam richTextBox używam do wykonania podświetlania składni. Jest to niewielki zakład edycji więc nie pisałem wyróżnienia niestandardowy składni - zamiast Używam Regex s i aktualizowanie po wykryciu opóźnienia wejściowego przy użyciu programu obsługi zdarzeń dla zdarzenia Application.Idle:RichTextBox BeginUpdate() EndUpdate() Metody rozszerzeń nie działa

Application.Idle += new EventHandler(Application_Idle); 

w przypadku Wózek sprawdzić po raz pole tekst został nieaktywna:

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

Ale nawet dla stosunkowo małych Podkreśla RichTextBox migocze mocno i nie ma richTextBox.BeginUpdate()/EndUpdate() metod. Aby temu zaradzić znalazłem this answer to a similar dilemma by Hans Passant (Hans Passant nigdy mnie nie zawiódł!):

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

Jednak to daje mi dziwne zachowanie podczas aktualizacji; kursor umiera/zamarza i pokazuje tylko dziwnie wyglądające paski (patrz zdjęcie poniżej).

Odd Error Caused by RichTextBox Method Extension

I oczywiście nie można użyć alternatywnego wątek zaktualizować UI, więc to, co robię źle tutaj?

Dzięki za poświęcony czas.

Odpowiedz

7

Spróbuj zmodyfikować EndUpdate, aby również później wywoływać Invalidate. Sterowanie nie musi aktualizować, więc musisz powiedzieć:

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

To jest mięta! Pracowałam jak czar ... Jedno małe pytanie, jak nauczysz się o metodach rozszerzania i ich subtelnościach? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);' nie jest dokładnie standardowym C# !? Albo to jest? – MoonKnight

+1

@Killercam 'SendMessage' i rozszerzenia to dwie różne rzeczy. 'SendMessage' wywołuje funkcję Windows API. W przypadku rozszerzeń zobacz [Metody rozszerzeń (C# Programming Guide)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech

+0

Dzięki za odpowiedź. Zdaję sobie sprawę, że te dwie są inne. Dzięki za link i pomoc, jest to najbardziej cenione. – MoonKnight

Powiązane problemy