私はリッチテキストボックスを使用しています。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;
}
はしかし、これは私の更新時に異常な動作を提供します。カーソルが消えて、奇妙に見えるストライプだけが表示されます(下の図を参照)。
私は明らかに私はここで間違って何をやっている、UIを更新するための代替スレッドを使用することはできませんか?
お時間をいただきありがとうございます。
これはミントです!魅力的なように働きました...小さな質問です。エクステンションメソッドとその微妙な点についてどうやって学びますか? 'SendMessage(this.Handle、WM_SETREDRAW、(IntPtr)1、IntPtr.Zero);'は正確に標準ではありません。またはそれは? – MoonKnight
@Killercam 'SendMessage'と拡張機能は2つの異なるものです。 'SendMessage'はWindows API関数を呼び出しています。拡張機能については、「拡張メソッド(C#プログラミングガイド)」(http://msdn.microsoft.com/en-us/library/bb383977.aspx)を参照してください。 – LarsTech
ご返信ありがとうございます。私は2つが違うことを認識しています。リンクとあなたの助けをありがとう、それは最も感謝しています。 – MoonKnight