一尘不染

RichTextBox语法实时高亮显示-禁用重绘

c#

我正在创建一个使用RichTextBox并可以访问关键字和’badwords’列表的函数。我需要突出显示 在用户键入时
在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);
}

布尔值“
paint”在开始突出显示之前设置为false,在结束时设置为true。但是正如我说的,我制作的函数必须包含在RichTextBox中。我不能使用子类。

因此,有没有办法从外部禁用RichTextBox的自动重绘?


阅读 562

收藏
2020-05-19

共1个答案

一尘不染

这是RichTextBox类中的一个疏忽。其他控件(如ListBox)支持BeginUpdate和EndUpdate方法来禁止绘画。这些方法生成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 /调用SendMessage。

2020-05-19