停用即時RichTextBox 語法突出顯示的重繪
在某些程式設計場景中,您可能需要動態突出顯示文字中的關鍵字或特定單字RichTextBox 作為使用者類型。但是,持續重新繪製可能會導致輸入過程中出現閃爍和不適。
為了改善使用者體驗,您可以在編輯文字時停用 RichTextBox 的自動重新繪製。不幸的是,標準的 RichTextBox 類別並沒有為此提供內建方法。
使用外部類別自訂 RichTextBox
一個解決方案是建立自訂 RichTextBox 類別這增加了缺少的功能。以下是一個範例:
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; }
然後您可以在自訂函數中使用BeginUpdate() 和EndUpdate() 方法來即時突出顯示關鍵字:
void HighlightKeywords(MyRichTextBox richTextBox) { richTextBox.BeginUpdate(); // Highlight keywords and bad words richTextBox.EndUpdate(); }
直接使用P/Invoke控制重繪
或者,您可以繞過使用自訂類別並使用 SendMessage 方法和 WM_SETREDRAW 訊息直接控制重繪。
更新RichTextBox 的文字之前:
[DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); const int WM_SETREDRAW = 0x0b; // (Disable repainting) SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
更新RichTextBox 的文字之後:
// (Enable repainting) SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); richTextBox.Invalidate();
這種方法允許您在不修改標準RichTextBox 類別的情況下獲得相同的結果。
以上是如何最佳化 RichTextBox 重畫以實現即時語法突出顯示?的詳細內容。更多資訊請關注PHP中文網其他相關文章!