首页 >后端开发 >C++ >如何消除语法高亮期间 RichTextBox 闪烁?

如何消除语法高亮期间 RichTextBox 闪烁?

Patricia Arquette
Patricia Arquette原创
2025-01-06 02:52:40337浏览

How to Eliminate RichTextBox Flickering During Syntax Highlighting?

禁用 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/在更新文本之前和之后直接调用“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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn