3

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;
4

2 に答える 2

1

Hans の構文強調テキスト ボックスを組み込んだように見えますが、それを使用しているようには見えません。

これらの単語を強調表示するときは、強調表示を行う前にカーソルの位置と長さを覚えておく必要があります。これは、コード内でカーソルを動かしていて、元に戻していないためです。

エラー チェックを行わずに、コードを次のように変更してみてください。

void editBox_TextChanged(object sender, EventArgs e) {
  this.editBox.BeginUpdate();
  int lastIndex = editBox.SelectionStart;
  int lastLength = editBox.SelectionLength;
  syntaxHighlightFromRegex();
  editBox.Select(lastIndex, lastLength);
  this.editBox.SelectionColor = Color.Black;
  this.editBox.EndUpdate();
  this.editBox.Invalidate();
}
于 2012-08-28T17:29:05.457 に答える
0

おっと、Hans コードを間違って使用していたことが判明しました。BeginUpdate() を呼び出してコントロールの描画を停止し、EndUpdate() を呼び出して再度描画を開始することになっていました。私はそれを逆にしていました。

助けてくれてありがとう、みんな(特にハンス)!

于 2012-08-28T17:36:22.533 に答える