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

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

DDD
DDD原創
2025-01-06 03:01:401004瀏覽

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