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; }
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(); }
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);
Selepas mengemas kini teks RichTextBox:
// (Enable repainting) SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); richTextBox.Invalidate();
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!