2012-02-23 2 views
5

일부 강조 표시를 수행하는 데 사용하고있는 richTextBox가 있습니다.RichTextBox BeginUpdate() EndUpdate() 확장 메서드가 작동하지 않습니다.

Application.Idle += new EventHandler(Application_Idle); 

시 : 대신 내가 Regex들 사용하고 Application.Idle 이벤트에 대한 이벤트 처리기를 사용하여 입력 지연의 검출에 업데이트하고 - 이것은 내가 정의 구문 하이 라이터를 작성하지 않은, 그래서 작은 편집 시설입니다 핸들러 나는 텍스트 상자가 비활성화 된 시간을 확인 :

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

그러나 심지어 상대적으로 작은 하이라이트의 RichTextBox 심하게 깜박하고는 더 richTextBox.BeginUpdate()/EndUpdate() 방법이 없습니다. 이 문제를 극복하기 위해 나는 this answer to a similar dilemma by Hans Passant이 (한스 옆모습이 아래로 나를 보자 적이있다!) 발견 : 그러나

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

, 이것은 나에게 업데이 트에 따라 이상한 행동을 제공합니다; 커서가 죽거나 얼어 이상한 모양의 줄무늬가 보입니다 (아래 이미지 참조).

Odd Error Caused by RichTextBox Method Extension

나는 명확하게 UI를 업데이트하는 다른 스레드를 사용할 수 없습니다 , 그래서 내가 잘못 여기서 뭐하는 거지?

감사합니다.

답변

7

나중에 EndUpdate을 수정하여 나중에 무효화를 호출하십시오. 컨트롤에서 일부 업데이트가 필요하다는 것을 알지 못하므로 알려 주어야합니다.

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

민트입니다. 매력처럼 작동 ... 하나의 작은 질문, 당신은 어떻게 확장 메서드 및 그들의 미묘함에 대해 배울 수 있습니까? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);'정확히 표준 C#이 아닙니다! 아니면 그렇지? – MoonKnight

+1

@Killercam'SendMessage'와 확장 기능은 두 가지입니다. 'SendMessage'는 Windows API 함수를 호출합니다. Extension에 대해서는 [Extension Methods (C# 프로그래밍 가이드)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx)를 참조하십시오. – LarsTech

+0

답장을 보내 주셔서 감사합니다. 나는이 둘이 다르다는 것을 깨닫는다. 링크 및 귀하의 도움을 주셔서 감사합니다, 그것은 가장 감사하겠습니다. – MoonKnight

관련 문제