Выделение строки текста в 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;
}