如何使用RichTextBox突出显示语法并禁用自动滚动?

时间:2013-10-10 02:55:48

标签: c# winforms richtextbox syntax-highlighting

所以我现在花了大约三天时间在互联网上搜索 - 谷歌,Stack Overflow,微软的C#文档 - 并且没有产生任何有用的结果。我的问题是我最近创建了一个非常灵活和快速的语法突出显示RichTextBox,它保存在UserControl中。我使用WinForms创建了它。

然而,尽管我的项目速度和灵活性,仍然存在一个明显且极其令人讨厌的故障。这个故障是我的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()方法。

1 个答案:

答案 0 :(得分:0)

在后台进程中放置DoHighlight()方法。 像这样:

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

有了这个技巧,你的DoHighlight()方法将并行运行。可以发生自动滚动。

您也可以在DoHighlight()方法中使用此代码:

Application.DoEvents();

这将暂停您的方法并执行其他事件,然后返回到您的方法。