2012-02-23 6 views
5

私はリッチテキストボックスを使用しています。RichTextBox BeginUpdate()EndUpdate()拡張メソッドが機能しない

Application.Idle += new EventHandler(Application_Idle); 

イベントに:代わりに、私はRegex Sを使用して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);'は正確に標準ではありません。またはそれは? – MoonKnight

+1

@Killercam 'SendMessage'と拡張機能は2つの異なるものです。 'SendMessage'はWindows API関数を呼び出しています。拡張機能については、「拡張メソッド(C#プログラミングガイド)」(http://msdn.microsoft.com/en-us/library/bb383977.aspx)を参照してください。 – LarsTech

+0

ご返信ありがとうございます。私は2つが違うことを認識しています。リンクとあなたの助けをありがとう、それは最も感謝しています。 – MoonKnight

関連する問題