C# RichTextBox 中用栈实现代码的自动缩进
2015-07-29 17:52
411 查看
首先说明我这里说的栈指的是数据结构中的栈,而并非内存中的堆栈
栈,一言以蔽之就是一种先入后出的数据结构.就和吃煎饼一样,最先烙的总是最后被吃掉.
好了,不说废话了,开始正文.
既然是实际应用,我先描述一下想要实现的问题.
在 RichTextBox 中我想实现的是类似于普通的IDE中的代码缩进功能,打一个 '{' 再
打一个回车时,就会自动缩进一个制表符,没有错就是这样一个简单的问题.
现在我给出我的解决思路以及部分的代码
其实思路很简单:
输入一个括号 入栈,删除一个括号 出栈,当光标位置变化,更新栈的维护区域.
部分代码如下
这个事件是
KeyDown 事件
这个事件是
TextChanged
部分实现就是这个样子
栈,一言以蔽之就是一种先入后出的数据结构.就和吃煎饼一样,最先烙的总是最后被吃掉.
好了,不说废话了,开始正文.
既然是实际应用,我先描述一下想要实现的问题.
在 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>
部分实现就是这个样子
相关文章推荐
- C#的注释和快速开启工具的命令
- C#编码规范
- C#的一个异常
- 泛型
- 关于C#中的Attribute的简单理解
- C#中Stack<T>类的使用及部分成员函数的源码分析
- C#中Stack<T>类的使用及部分成员函数的源码分析
- C#的pictureBox怎样使用多张图片简单切换
- C# 系列——未能找到路径“..”的一部分
- c#系列——“OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。
- 改进C# WinForm窗体及其控件的自适应
- C#中各种计时器
- c# 父类的引用指向子类的实例
- C#中的事务
- C#系列——实现鼠标忙碌状态
- C#面向对象三大特性之三:多态
- C#两路list数组归并去重
- C# WinForm开发系列 - Open-Source Controls
- C# WinForm开发系列 - ListBox/ListView/Panel
- C# WinForm开发系列 - 文章索引