0

それで、私は約 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() メソッドが呼び出されることに注意することも重要だと思います。

4

1 に答える 1

0

DoHighlight() メソッドをバックグラウンド プロセスに配置します。このような:

  BackgroundWorker bgw = new BackgroundWorker();
  bgw.DoWork += DoHighlight();
  bgw.RunWorkerAsync();

このトリックを使用すると、 DoHighlight() メソッドが並行して実行され、自動スクロールが発生する可能性があります。

DoHighlight() メソッドでこのコードを使用することもできます。

Application.DoEvents();

これにより、メソッドが一時停止し、他のイベントが実行されてから、メソッドに戻ります。

于 2013-10-10T08:03:41.813 に答える