gpt4 book ai didi

c# - RichTextBox语法实时高亮--禁用重绘

转载 作者:可可西里 更新时间:2023-11-01 08:02:47 24 4
gpt4 key购买 nike

我正在创建一个函数,它接受一个 RichTextBox 并可以访问关键字列表和“坏词”。我需要在 用户键入时 突出显示我在 RichTextBox 中找到的任何关键字和坏词,这意味着每次释放编辑键时都会调用该函数。

我已经编写了这个函数,但是框中的文字和光标闪烁得太多,让人感觉不舒服。

我发现了一个解决方案——在我编辑和格式化其文本时禁用 RichTextBox 重绘自身的能力。但是,我知道这样做的唯一方法是重写“WndProc”函数并拦截(我一直要收集的是)重绘消息,如下所示:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x00f) {
if (paint)
base.WndProc(ref m);
else
m.Result = IntPtr.Zero;
}
else
base.WndProc(ref m);
}

bool 值“paint”在我开始突出显示之前设置为 false,在我完成时设置为 true。但正如我所说,我制作的功能必须采用 RichTextBox;我不能使用子类。

那么,有没有办法“从外部”禁用 RichTextBox 的自动重绘?

最佳答案

这是对 RichTextBox 类的疏忽。其他控件(如 ListBox)支持 BeginUpdate 和 EndUpdate 方法来抑制绘制。这些方法生成 WM_SETREDRAW 消息。 RTB其实是支持这个消息的,但是他们忘了添加方法。

只需自己添加即可。 Project + Add Class,粘贴下图代码。编译控件并将其从工具箱顶部拖放到窗体上。

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。

关于c# - RichTextBox语法实时高亮--禁用重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282384/

24 4 0