Выделение строки текста в richtextbox

Поэтому я работаю над программой, которая предлагает пользователю трехмерную визуализацию структур данных и алгоритмы сортировки. То, что я хотел бы сделать, это иметь richtextbox в пользовательском интерфейсе, который показывает код для конкретного алгоритма, который выполняется. И затем я хотел бы, чтобы каждая конкретная строка кода была выделена во время ее выполнения. Я просто хотел начать с визуализации стека, так как с этим легче иметь дело, когда я учусь и работаю в этом проекте. Прямо сейчас у меня есть текстовый файл функций push и pop C++, и я сохраняю текст в список. Затем я пишу текст в richtextbox. Все это работает, но я не знаю, как выделить строку, а затем выделить следующую строку. Например, когда я нажимаю "push", я бы хотел выделить "list[stackTop] = newItem;" затем нарисуйте 3d-куб (уже сделано), затем выделите строку "stackTop++". Затем пользователь может сделать это снова или как угодно.

class CppFunctionsArray
    {
    List<string> ReadFunctions = new List<string>();
    int Position = 0;

    //Reads input from selected file and stores into ReadFunctions Array;
    public void ReadInput(string fileName)
    {

        using (StreamReader r = new StreamReader(fileName))
        {
            string line;
            while ((line = r.ReadLine()) != null)
            {
                ReadFunctions.Add(line);
            }
        }
    }

    //Writes lines to a RichTextBox.
    public void WriteToRichTextBox(RichTextBox rtb, int startIndex, int endIndex, int  lineNumber)
    {
        Position = 0;
        for (int i = startIndex; i < endIndex; i++)
        {
            rtb.AppendText(ReadFunctions[i]);
            rtb.AppendText(Environment.NewLine);
            rtb.Font = new Font("times new roman", 12, FontStyle.Bold);

            //Temporary
            if (lineNumber == Position)
                  rtb.SelectionBackColor = Color.Red;
            Position++;

        }
    }

Это не темы, которые они преподают мне в колледже. Я просто учу себя здесь. Так что, если я подхожу к этому совершенно неправильно, я открыт для чего-либо здесь.

Вот мой обработчик события для кнопки "stackPush".

    //Adds cube on top of the previous.
    private void StackPush_Click(object sender, EventArgs e) 
    {

        CppFunctionsArray ArrayOfFunctions = new CppFunctionsArray();
        CodeTextBox.Clear();
        ArrayOfFunctions.ReadInput("StackFunctions.txt");

        //The 4 represents the line Number to highlight. TODO FIX THIS.
        ArrayOfFunctions.WriteToRichTextBox(CodeTextBox, 1, 12,4);

        //Draws a new cube of 1 unit length.
        cube = new Visual();
        //Adds cube to list;
        cubeList.Add(cube);
        cube.y = position;
        position++;

    }

1 ответ

Если вы ищете метод расширения, чтобы очистить цвет фона от всех строк RichTextBox, а затем закрасить конкретную линию, должно быть достаточно следующего:

    public static void HighlightLine(this RichTextBox richTextBox, int index, Color color)
    {
        richTextBox.SelectAll();
        richTextBox.SelectionBackColor = richTextBox.BackColor;
        var lines = richTextBox.Lines;
        if (index < 0 || index >= lines.Length)
            return;
        var start = richTextBox.GetFirstCharIndexFromLine(index);  // Get the 1st char index of the appended text
        var length = lines[index].Length;
        richTextBox.Select(start, length);                 // Select from there to the end
        richTextBox.SelectionBackColor = color;
    }
Другие вопросы по тегам