C#开发高亮语法编辑器(一)——TextBox ,RichTextBox
2008-12-04 10:04
453 查看
一、RichTextBox基本设置
二、实现语法高亮
三、关键字提示
四、实现行号
就简单快速得开发文本编辑器TextBox 最为简单,大家用得也多,缺点是无法实现复杂的操作。RichTextBox虽然是则功能比它强大很多。
这里要实现以下功能的编辑器:
1、实现语法高亮;
2、关键字提示;
3、行号。
显然TextBox 无法完成我们的任务,虽然都派生自TextBoxBase,但就控制力而言RichTextBox比它优秀很多。这里选用RichTextBox尝试开发。
注:以下只讨论简单开发,不考虑复杂的关键字查找机制。
一、RichTextBox基本设置
这里先建立一个工程,建立窗体Form1。
可以简单添加RichTextBox控件,可以在Form1_Load中建立。代码如下:
复制
保存
这样就建立了简单的RichTextBox,宽度和高度都设置了。没有做Form1窗体缩放的处理。
二、实现语法高亮
在RichTextBox里实现语法高亮还是非常简单的。可以使用
复制
保存
意思是,先选择第一个字母,按上面的设置,选择到了数字‘1’,然后设置这个字的字体大小,再设置字的颜色。
如果对关键字进行处理(这里只处理光标向后流动的情况)
首先添加输入事件
复制
保存
建立关键字
复制
保存
当KeyDown事件发生时,向前查找
复制
保存
复制
保存
复制
保存
这样就完成了高亮工作。
三、关键字提示
实现关键字提示也是在KeyDown中实现,在提示字种搜索GetLastWord返回的文字,如果前半部分匹配。那么就建立ListBox控件。
复制
保存
当然,另外一面,如果创建ListBox,而又在RichTextBox 点击了鼠标也去释放。
复制
保存
当然还得在Form1_Load里注册事件
复制
保存
然后设置ListBox 被选择后用被选择的关键字替换前文搜索到的字符。
下面我们来看看实现行号。
四、实现行号
这个是RichTextBox 唯一令我遗憾的地方,居然无法实现行号问题。为什么呢?我首先想到的是自己画。用rich.CreateGraphics()来画。但是,由于画的时候发生在窗体被创建时,所以画不成功,而被RichTextBox 本身的绘制给覆盖了。
然后我选择了在里面添加Label控件
复制
保存
rich.SelectionIndent = 40;是把光标对齐到左边距40的位置,防止光标被Label覆盖。
实现编号还不是太难。麻烦出在如何让Lable能跟随RichTextBox 的滚动条滚动。不说实现的 细节,我就假设,如果滚动条向上滚,那么Lable的Top属性增加,反之则减少。但是,RichTextBox 居然无法对ScollBar进行监测。
根本每办法知道滚动条滚动了多少位置,甚至都没办法知道滚动条滚动的方向。
尝试去除滚动条,然后之间添加新的滚动条
复制
保存
但是非常难于实现同步滚动,位置很难控制。这个就是目前遇到的RichTextBox 的最大局限性了,非常遗憾,无法开发出这个功能。
二、实现语法高亮
三、关键字提示
四、实现行号
就简单快速得开发文本编辑器TextBox 最为简单,大家用得也多,缺点是无法实现复杂的操作。RichTextBox虽然是则功能比它强大很多。
这里要实现以下功能的编辑器:
1、实现语法高亮;
2、关键字提示;
3、行号。
显然TextBox 无法完成我们的任务,虽然都派生自TextBoxBase,但就控制力而言RichTextBox比它优秀很多。这里选用RichTextBox尝试开发。
注:以下只讨论简单开发,不考虑复杂的关键字查找机制。
一、RichTextBox基本设置
这里先建立一个工程,建立窗体Form1。
可以简单添加RichTextBox控件,可以在Form1_Load中建立。代码如下:
复制
保存
this[/b].WindowState = System.Windows.Forms.FormWindowState.Maximized; RichTextBox rich = new[/b] RichTextBox(); rich.Multiline = true[/b]; rich.Height = this[/b].Height - 100; rich.Width = this[/b].Width - 100; rich.Left = 40; rich.Top = 40; rich.WordWrap = true[/b]; rich.Text = "12345678"[/b]; rich.ScrollBars = RichTextBoxScrollBars.ForcedVertical; this[/b].Controls.Add(rich);
这样就建立了简单的RichTextBox,宽度和高度都设置了。没有做Form1窗体缩放的处理。
二、实现语法高亮
在RichTextBox里实现语法高亮还是非常简单的。可以使用
复制
保存
rich.Select(0, 1); rich.SelectionFont = new[/b] Font("宋体"[/b], 12, (FontStyle.Regular)); rich.SelectionColor = Color.Blue;
意思是,先选择第一个字母,按上面的设置,选择到了数字‘1’,然后设置这个字的字体大小,再设置字的颜色。
如果对关键字进行处理(这里只处理光标向后流动的情况)
首先添加输入事件
复制
保存
rich.KeyDown += new[/b] KeyEventHandler(rich_KeyDown); //这一行添加到Form1_Load中 [/b] void[/b] rich_KeyDown(object[/b] sender, KeyEventArgs e) { //throw new Exception("The method or operation is not implemented."); [/b]}
建立关键字
复制
保存
public[/b] static[/b] List<string[/b]> AllClass() { List<string[/b]> list = new[/b] List<string[/b]>(); list.Add("function"[/b]); list.Add("return"[/b]); list.Add("class"[/b]); list.Add("new"[/b]); list.Add("extends"[/b]); list.Add("var"[/b]); return[/b] list; }
当KeyDown事件发生时,向前查找
复制
保存
//返回搜索字符 [/b]public[/b] static[/b] string[/b] GetLastWord(string[/b] str, int[/b] i) { string[/b] x = str; Regex reg = new[/b] Regex(@"/s+[a-z]+/s*"[/b], RegexOptions.RightToLeft); x = reg.Match(x).Value; Regex reg2 = new[/b] Regex(@"/s"[/b]); x = reg2.Replace(x, ""[/b]); return[/b] s; }
复制
保存
void[/b] rich_KeyDown(object[/b] sender, KeyEventArgs e) { RichTextBox rich = (RichTextBox) sender; //throw new Exception("The method or operation is not implemented."); [/b] string[/b] s = GetLastWord(rich.Text, rich.SelectionStart); if[/b] (AllClass().IndexOf(s) > -1) { MySelect(rich, rich.SelectionStart, s, Color.CadetBlue, true[/b]); } }
复制
保存
//设定颜色 [/b]public[/b] static[/b] void[/b] MySelect(System.Windows.Forms.RichTextBox tb, int[/b] i, string[/b] s, Color c, bool[/b] font) { tb.Select(i - s.Length, s.Length); tb.SelectionColor = c; //是否改变字体 [/b] if[/b] (font) tb.SelectionFont = new[/b] Font("宋体"[/b], 12, (FontStyle.Bold)); else[/b] tb.SelectionFont = new[/b] Font("宋体"[/b], 12, (FontStyle.Regular)); //以下是把光标放到原来位置,并把光标后输入的文字重置 [/b] tb.Select(i, 0); tb.SelectionFont = new[/b] Font("宋体"[/b], 12, (FontStyle.Regular)); tb.SelectionColor = Color.Black; }
这样就完成了高亮工作。
三、关键字提示
实现关键字提示也是在KeyDown中实现,在提示字种搜索GetLastWord返回的文字,如果前半部分匹配。那么就建立ListBox控件。
复制
保存
void[/b] tb_KeyDown(object[/b] sender, KeyEventArgs e) { RichTextBox tb = (RichTextBox) sender; if[/b] (/*条件搜索到匹配字符*/[/b]) { //搜索ListBox是否已经被创建 [/b] Control[] c = tb.Controls.Find[/b]("mylb"[/b], false[/b]); if[/b] (c.Length > 0) ((ListBox) c[0]).Dispose(); //如果被创建则释放 [/b] ListBox lb = new[/b] ListBox(); lb.Name = "mylb"[/b]; lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Items.Add("asdasdasd"[/b]); lb.Show(); lb.TabIndex = 100; lb.Location = tb.GetPositionFromCharIndex(tb.SelectionStart); lb.Left += 10; tb.Controls.Add(lb); } }
当然,另外一面,如果创建ListBox,而又在RichTextBox 点击了鼠标也去释放。
复制
保存
void[/b] rich_MouseClick(object[/b] sender, MouseEventArgs e) { RichTextBox tb = (RichTextBox) sender; Control[] c = tb.Controls.Find[/b]("mylb"[/b], false[/b]); if[/b] (c.Length > 0) ((ListBox) c[0]).Dispose(); }
当然还得在Form1_Load里注册事件
复制
保存
rich.MouseClick += new[/b] MouseEventHandler(rich_MouseClick);
然后设置ListBox 被选择后用被选择的关键字替换前文搜索到的字符。
下面我们来看看实现行号。
四、实现行号
这个是RichTextBox 唯一令我遗憾的地方,居然无法实现行号问题。为什么呢?我首先想到的是自己画。用rich.CreateGraphics()来画。但是,由于画的时候发生在窗体被创建时,所以画不成功,而被RichTextBox 本身的绘制给覆盖了。
然后我选择了在里面添加Label控件
复制
保存
Label l = new[/b] Label(); l.Name = "l"[/b]; l.Top = 0; l.TextAlign = ContentAlignment.TopRight; l.Width = 40; l.Text = "1"[/b]; l.Font = new[/b] Font("宋体"[/b], 12, (FontStyle.Regular)); l.Height = this[/b].Height; l.BackColor = Color.Gray; l.BorderStyle = BorderStyle.None; rich.Controls.Add(l); rich.SelectionIndent = 40;
rich.SelectionIndent = 40;是把光标对齐到左边距40的位置,防止光标被Label覆盖。
实现编号还不是太难。麻烦出在如何让Lable能跟随RichTextBox 的滚动条滚动。不说实现的 细节,我就假设,如果滚动条向上滚,那么Lable的Top属性增加,反之则减少。但是,RichTextBox 居然无法对ScollBar进行监测。
根本每办法知道滚动条滚动了多少位置,甚至都没办法知道滚动条滚动的方向。
尝试去除滚动条,然后之间添加新的滚动条
复制
保存
VScrollBar vs = new[/b] VScrollBar(); //vs.Dock = DockStyle.Right; [/b]vs.Name = "vs"[/b]; vs.Maximum = 0; vs.Minimum = 0; vs.MaximumSize = new[/b] Size(0, 0); vs.Top = 0; vs.Left = rich.Parent.Width - 100 - 22; vs.Height = rich.Parent.Height - 100 - 1; vs.Value = 0; vs.Scroll += new[/b] ScrollEventHandler(vs_Scroll); rich.Controls.Add(vs);
但是非常难于实现同步滚动,位置很难控制。这个就是目前遇到的RichTextBox 的最大局限性了,非常遗憾,无法开发出这个功能。
相关文章推荐
- C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
- C#开发高亮语法编辑器(一)——TextBox ,RichTextBox
- C#开发高亮语法编辑器——TextBox ,RichTextBox
- C#开发高亮语法编辑器(一)——TextBox ,RichTextBox
- 使用类eclipse编辑器开发小程序,支持代码高亮与语法自动提示
- debian中配置c#语法高亮的vim编辑器,并使用YouCompleteMe自动补全
- C#简单实现高亮语法编辑器
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十四)地图编辑器诞生啦!
- EclipsePlug-in使用TextEditor开发自己的编辑器,实现关键字高亮和代码提示.
- EclipsePlug-in使用TextEditor开发自己的编辑器,实现关键字高亮和代码提示.
- 一个C#语法高亮插件
- windows Phone 7开发:C#与java不同的一些特殊语法
- 毕业生的商业软件开发之路 --- C#基本语法-C#代码模块逻辑框架
- unity开发 --------- c# 基本语法 008
- 【Unity3d】游戏开发笔记二 C#与JS之间的语法差异
- unity开发 --------- c# 基本语法 001
- Qt制作高亮语法编辑器
- C#控件开发---控件属性编辑器
- unity开发 --------- c# 基本语法 007
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十五)地图编辑器的初步使用