RichTextBox 構文強調表示の再描画の無効化
ユーザー入力中に RichTextBox で構文強調表示を実行する場合、ちらつきを解決するには再描画を無効にする必要があります。
現在の非効率解決策
現在の解決策には、「WndProc」関数をオーバーライドして再描画メッセージをインターセプトおよび抑制することが含まれます。ただし、このアプローチは、提供された RichTextBox を操作する外部関数には現実的ではありません。
見落としを克服する
より効果的なアプローチは、不足している BeginUpdate メソッドと EndUpdate メソッドを追加することです。 RichTextBox クラスに追加します。これらのメソッドは、再描画を抑制するために WM_SETREDRAW メッセージを生成します。
メソッドの追加
次のコマンドを使用して、プロジェクトに新しいクラスを作成します。コード:
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); this.Invalidate(); } [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); private const int WM_SETREDRAW = 0x0b; }
使用法
これらのメソッドを使用して、構文強調表示機能内で再描画を無効または有効にできるようになりました。
代替解決策
にメソッドを追加する場合クラスを使用することはできません。テキストを更新する前後に P/Invoke "SendMessage" 関数を直接使用することもできます。
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); // Disable repainting // Update text SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); // Enable repainting this.Invalidate();
以上が構文の強調表示中の RichTextBox のちらつきをなくす方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。