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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rongdongzhu1/article/details/47131617
首先说明我这里说的栈指的是数据结构中的栈,而并非内存中的堆栈
栈,一言以蔽之就是一种先入后出的数据结构.就和吃煎饼一样,最先烙的总是最后被吃掉.

好了,不说废话了,开始正文.
既然是实际应用,我先描述一下想要实现的问题.
在 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


扫描二维码关注公众号,回复: 6155954 查看本文章
<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>


部分实现就是这个样子

猜你喜欢

转载自blog.csdn.net/rongdongzhu1/article/details/47131617
今日推荐