RichTextBox
構文が強調表示されたコードを表示するコードで を使用しています。ここで、キーストロークごとに、すべてのトークンを再解析し、もう一度色を付け直す必要があります。ただし、a 内の個々の単語に色を付ける唯一の方法WinForm richtextbox
は、それらの単語を 1 つずつ選択し、SelectionFont を使用して色を付けることです。
しかし、ユーザーが非常に速く入力している場合、個々の単語を選択することによって非常に目立つちらつきが発生します (選択した単語には Windows の青色の背景があり、ちらつきの原因となっています)。個々の単語を選択せずに色を付けることができる方法はありますか (したがって、選択したテキストの周りに青いハイライトが表示されます)。着色中にレンダリングを無効にするために使用しようとしSuspendLayout()
ましたが、それは役に立ちませんでした。前もって感謝します!
これが私のコードです:
コード:
private void editBox_TextChanged(object sender, EventArgs e) {
syntaxHighlightFromRegex();
}
private void syntaxHighlightFromRegex() {
this.editBox.SuspendLayout();
string REG_EX_KEYWORDS = @"\bSELECT\b|\bFROM\b|\bWHERE\b|\bCONTAINS\b|\bIN\b|\bIS\b|\bLIKE\b|\bNONE\b|\bNOT\b|\bNULL\b|\bOR\b";
matchRExpression(this.editBox, REG_EX_KEYWORDS, KeywordsSyntaxHighlightFont, KeywordSyntaxHighlightFontColor);
}
private void matchRExpression(RichTextBox textBox, string regexpression, Font font, Color color) {
System.Text.RegularExpressions.MatchCollection matches = Regex.Matches(this.editBox.Text, regexpression, RegexOptions.IgnoreCase);
foreach (Match match in matches) {
textBox.Select(match.Index, match.Length);
textBox.SelectionColor = color;
textBox.SelectionFont = font;
}
}
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);
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int WM_SETREDRAW = 0x0b;