Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengoptimumkan Pengecatan Semula RichTextBox untuk Penyerlahan Sintaks Masa Nyata?

Bagaimanakah Saya Boleh Mengoptimumkan Pengecatan Semula RichTextBox untuk Penyerlahan Sintaks Masa Nyata?

DDD
Lepaskan: 2025-01-06 03:01:40
asal
1000 orang telah melayarinya

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

Melumpuhkan Cat Semula untuk Penyerlahan Sintaks RichTextBox Masa Nyata

Dalam senario pengaturcaraan tertentu, anda mungkin perlu menyerlahkan kata kunci atau perkataan khusus secara dinamik dalam RichTextBox sebagai pengguna menaip. Walau bagaimanapun, pengecatan semula yang berterusan boleh menyebabkan kelipan dan ketidakselesaan semasa input.

Untuk meningkatkan pengalaman pengguna, anda boleh melumpuhkan pengecatan automatik RichTextBox semasa anda mengedit teksnya. Malangnya, kelas RichTextBox standard tidak menyediakan kaedah terbina dalam untuk ini.

Menyesuaikan RichTextBox dengan Kelas Luaran

Satu penyelesaian ialah mencipta kelas RichTextBox tersuai yang menambah fungsi yang hilang. Berikut ialah contoh:

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;
}
Salin selepas log masuk

Anda kemudiannya boleh menggunakan kaedah BeginUpdate() dan EndUpdate() dalam fungsi tersuai anda yang menyerlahkan kata kunci dalam masa nyata:

void HighlightKeywords(MyRichTextBox richTextBox) {
    richTextBox.BeginUpdate();

    // Highlight keywords and bad words

    richTextBox.EndUpdate();
}
Salin selepas log masuk

Secara langsung Mengawal Mengecat Semula Menggunakan P/Invoke

Sebagai alternatif, anda boleh memintas menggunakan tersuai kelas dan mengawal terus mengecat semula menggunakan kaedah SendMessage dengan mesej WM_SETREDRAW.

Sebelum mengemas kini teks 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);
Salin selepas log masuk

Selepas mengemas kini teks RichTextBox:

// (Enable repainting)
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
richTextBox.Invalidate();
Salin selepas log masuk

Pendekatan ini membolehkan anda mencapai hasil yang sama tanpa mengubah suai RichTextBox standard kelas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pengecatan Semula RichTextBox untuk Penyerlahan Sintaks Masa Nyata?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan