それで、私は約 3 日間インターネット (Google、Stack Overflow、Microsoft の C# ドキュメント) を検索しましたが、役立つ結果は得られませんでした。私の問題は、UserControl に保持されている非常に柔軟で高速な構文強調表示の RichTextBox を最近作成したことです。WinForms を使用してこれを作成しました。
しかし、私のプロジェクトの速度と柔軟性にもかかわらず、明らかで非常に不快な不具合が 1 つあります。この不具合は、RichTextBox が自動的にスクロールすることです...All...The...Time。この自動スクロールが発生するのは望ましくありません。テキストを強調表示すると、ユーザーには動きや遷移が表示されず、色付きの文字と記号のみが表示されます。私のプロジェクトの構文の強調表示に影響を与えているコードは次のとおりです。
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private void DoHighlight()
{
if (TextEditor.Text.Length <= 0)
return;
int visibleStart = TextEditor.GetCharIndexFromPosition(new Point(1, 1));
int visibleEnd = TextEditor.GetCharIndexFromPosition(new Point(1, TextEditor.Height - 1)) + TextEditor.Lines[BottomLine].Length;
int[] curSelection = new [] {TextEditor.SelectionStart,TextEditor.SelectionLength};
LineCounter.Focus();
SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
TextEditor.SelectAll();
TextEditor.SelectionColor = TextEditor.ForeColor;
if (parser != null)
parser.HighlightText(this, visibleStart, visibleEnd);
TextEditor.SelectionStart = curSelection[0];
TextEditor.SelectionLength = curSelection[1];
SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
TextEditor.Invalidate();
TextEditor.Focus();
}
いくつかのデバッグを行い、多くのブレークポイントを使用した後、DoHighlight() メソッドが終了してコースを実行するまで、自動スクロールは発生しないと判断しました。
また、RichTextBox のテキストが現在変更されるたびに、この DoHighlight() メソッドが呼び出されることに注意することも重要だと思います。