首頁 > 後端開發 > C++ > 如何最佳化 RichTextBox 重畫以實現即時語法突出顯示?

如何最佳化 RichTextBox 重畫以實現即時語法突出顯示?

DDD
發布: 2025-01-06 03:01:40
原創
1104 人瀏覽過

How Can I Optimize RichTextBox Repainting for Real-Time Syntax Highlighting?

停用即時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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板