禁用实时 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中文网其他相关文章!