您的位置:首页 > 编程语言 > C#

C# RichTextBox 中用栈实现代码的自动缩进

2015-07-29 17:52 411 查看
首先说明我这里说的栈指的是数据结构中的栈,而并非内存中的堆栈

栈,一言以蔽之就是一种先入后出的数据结构.就和吃煎饼一样,最先烙的总是最后被吃掉.

好了,不说废话了,开始正文.

既然是实际应用,我先描述一下想要实现的问题.

在 RichTextBox 中我想实现的是类似于普通的IDE中的代码缩进功能,打一个 '{' 再

打一个回车时,就会自动缩进一个制表符,没有错就是这样一个简单的问题.

现在我给出我的解决思路以及部分的代码

其实思路很简单:

输入一个括号 入栈,删除一个括号 出栈,当光标位置变化,更新栈的维护区域.

部分代码如下

这个事件是

KeyDown 事件

// 上下左右方向键 及 删除键的处理
switch(e.KeyCode){
case Keys.Up:
// 当前行和下一行

if(KeyDownBIA == 0){

KeyDownBIA ++;
}
else{
// 不能超过最大行
int line  = (CodeEdit.GetLineFromCharIndex(CodeEdit.Text.Length));
if(KeyDownBIA < line)
KeyDownBIA ++;
}
break;

case Keys.Down:
if(KeyDownBIA == 0){
KeyDownBIA --;
}
else{
// 不能小于0行
if(KeyDownBIA > 0)
KeyDownBIA --;
}
break;

case Keys.Left:					// 左

// 用异常机制处理越界
try{
if(CodeEdit.Text[SelectionStart-1] == '{')
stack--;
else if(CodeEdit.Text[SelectionStart-1] == '}')
stack++;

}
catch{
return;
}
break;

case Keys.Right:				// 右
// 用异常机制处理越界
try{
if(CodeEdit.Text[SelectionStart] == '}')
stack--;
else if(CodeEdit.Text[SelectionStart] == '{')
stack++;

}
catch{
return;
}
break;

case Keys.Back:
// 当且仅当删除单个字符时
if(CodeEdit.SelectedText.Length <= 0){
// 用异常机制处理越界
try{
if(CodeEdit.Text[SelectionStart-1] == '{')
stack--;
else if(CodeEdit.Text[SelectionStart-1] == '}')
stack++;
}
catch{
return;
}
}

break;

}


这个事件是

TextChanged

<span style="white-space:pre">			</span>if(EnterBIA > 0){<span style="white-space:pre">		</span>// EnterBIA 标记按键是否为用户触发

if(stack >= 0){
SelectionStart = CodeEdit.SelectionStart;
for(i =0;i<stack;i++)
// 在光标处插入颜色则不会改变颜色
CodeEdit.SelectedText += '\t';
CodeEdit.Select(SelectionStart+i,0);
CodeEdit.SelectionColor = Color.Black;
}

EnterBIA = -1;

}<span style="white-space:pre">		</span>


部分实现就是这个样子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: