现在的很多编辑工具都能实现代码中关键字的高亮显示,自己一时好玩也就随便写了一个:

首先建立一个XML文件:csharp.xml

<?xml version="1.0" encoding="utf-8" ?><definition name="C#" caseSensitive="true"><word color="BLUE">private</word><word color="BLUE">protected</word><word color="BLUE">public</word><word color="BLUE">namespace</word><word color="BLUE">class</word><word color="BLUE">for</word><word color="BLUE">if</word><word color="BLUE">else</word><word color="BLUE">while</word><word color="BLUE">switch</word><word color="BLUE">case</word><word color="BLUE">using</word><word color="BLUE">get</word><word color="BLUE">return</word><word color="BLUE">null</word><word color="BLUE">void</word><word color="BLUE">int</word><word color="BLUE">string</word><word color="BLUE">float</word><word color="BLUE">char</word><word color="BLUE">this</word><word color="BLUE">set</word><word color="BLUE">new</word><word color="BLUE">true</word><word color="BLUE">false</word><word color="BLUE">const</word><word color="BLUE">static</word><word color="BLUE">internal</word><word color="BLUE">extends</word><word color="BLUE">super</word><word color="BLUE">import</word><word color="BLUE">default</word><word color="BLUE">break</word><word color="BLUE">try</word><word color="BLUE">catch</word><word color="BLUE">finally</word><word color="CadetBlue">Main</word><word color="CadetBlue">WriteLine</word><word color="CadetBlue">Console</word><word color="CadetBlue">WriteLine</word><word color="DarkOrange">;</word><register>printf</register></definition>

其中color指定了该关键字的颜色.

然后在VS中新建一工程,添加下面的这个类:

using System;using System.Xml;using System.IO;using System.Collections;using System.Reflection;using System.Drawing;

namespace WindowsApplication1{

public class Parser    {private XmlDocument xd=null; private ArrayList al=null; //对xml流解析后,会把每一个关键字字符串放入这个容器中        private bool caseSensitive=false; //记录当前语言大小写敏感否        private ArrayList cl=null;//对xml流解析后,把每一个C关键字颜色保留

internal Parser(SyntaxEditor.Languages language) //构造函数接受一个枚举变量        {                        Assembly asm = Assembly.GetExecutingAssembly();string filename="";switch(language) //取得xml文件名            {case SyntaxEditor.Languages.CSHARP:                    filename="csharp.xml";break;case SyntaxEditor.Languages.JSHARP:                    filename="jsharp.xml";break;case SyntaxEditor.Languages.SQL:                    filename="sql.xml";break;case SyntaxEditor.Languages.VBSCRIPT:                    filename="vbscript.xml";break;default:break;            }

            StreamReader reader= new StreamReader(filename,        System.Text.Encoding.UTF8); //下面的代码解析xml流

            xd=new XmlDocument();            xd.Load(reader);

            al=new ArrayList();            cl=new ArrayList();            XmlElement root=xd.DocumentElement;

            XmlNodeList xnl=root.SelectNodes("/definition/word");for(int i=0;i<xnl.Count;i++)            {                  al.Add(xnl[i].ChildNodes[0].Value); //将关键子收集到al                cl.Add(xnl[i].Attributes["color"].Value);//收集关键字的颜色

            }//检测是否判断大小写            this.caseSensitive=bool.Parse(root.Attributes["caseSensitive"].Value);

        }

public Color IsKeyWord(string word ) //判断字符串是否为关键字        {

for(int i=0;i<al.Count;i++)            {if(string.Compare(word,al[i].ToString(),!caseSensitive)==0)                {string ColorTemp=(cl[i].ToString()!=string.Empty?cl[i].ToString():"Black");                                        Color c;try                    {                         c=Color.FromName(ColorTemp);                    }catch (Exception e)                    {                         c=Color.Black;                    }return c;                                    }            }

return Color.Black;

        }

    }}

然后新建一用户控件继承RichTextBox

using System;using System.Collections;using System.ComponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;using System.Runtime.InteropServices;using HWND = System.IntPtr;

namespace WindowsApplication1{/// <summary>/// SyntaxEditor 的摘要说明。/// </summary>    public class SyntaxEditor :System.Windows.Forms.RichTextBox    {        /// <summary> /// 必需的设计器变量。

/// </summary>        private System.ComponentModel.Container components = null;    int line;private Parser parser;/// <summary>/// 必需的设计器变量。/// </summary>        //使用win32api:SendMessage来防止控件着色时的闪烁现象        [DllImport("user32")] private static extern int SendMessage(HWND hwnd, int wMsg, int wParam, IntPtr lParam);private const int WM_SETREDRAW = 0xB;public SyntaxEditor()        {// 该调用是 Windows.Forms 窗体设计器所必需的。            InitializeComponent();base.WordWrap=false;// TODO: 在 InitComponent 调用后添加任何初始化

        }/// <summary>/// 清理所有正在使用的资源。/// </summary>        protected override void Dispose( bool disposing )        {if( disposing )            {if( components != null )                    components.Dispose();            }base.Dispose( disposing );        }#region 组件设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器 /// 修改此方法的内容。/// </summary>        private void InitializeComponent()        {        this.Name = "SyntaxEditor";

        }#endregion//重写基类的OnTextChanged方法。为了提高效率,程序是对当前文本插入点所在行进行扫描,//以空格为分割符,判断每个单词是否为关键字,并进行着色。        protected override void OnTextChanged(EventArgs e)         {if(base.Text!="")            {int selectStart=base.SelectionStart;                line=base.GetLineFromCharIndex(selectStart);string lineStr=base.Lines[line];int linestart=0;for(int i=0;i<line;i++)                {                    linestart+=base.Lines[i].Length+1;                }

                SendMessage(base.Handle, WM_SETREDRAW, 0, IntPtr.Zero);

base.SelectionStart=linestart;base.SelectionLength=lineStr.Length;base.SelectionColor=Color.Black;base.SelectionStart=selectStart;base.SelectionLength=0;

//对一行字符串用空格或者.分开                string[] words=lineStr.Split(new char[]{' ','.','\n','(',')','}','{','"','[',']'});                                parser=new Parser(this.language);

for(int i=0;i<words.Length;i++)//一个字符段一个字符段来判断                {

//判断是否是程序保留字 是的话高亮显示                    if(parser.IsKeyWord(words[i])!=Color.Empty)                    { int length=0;for(int j=0;j<i;j++)                        {                            length+=words[j].Length;                         }                        length+=i;int index=lineStr.IndexOf(words[i],length);

base.SelectionStart=linestart+index;base.SelectionLength=words[i].Length;//base.SelectionFont                        base.SelectionColor=parser.IsKeyWord(words[i]);

base.SelectionStart=selectStart;base.SelectionLength=0;base.SelectionColor=Color.Black;                    }

                }                SendMessage(base.Handle, WM_SETREDRAW, 1, IntPtr.Zero);base.Refresh();            }base.OnTextChanged (e);        }

public new bool WordWrap        {get{return base.WordWrap;}set{ base.WordWrap=value;}        }

public enum Languages        {            SQL,            VBSCRIPT,            CSHARP,            JSHARP        }

private Languages language=Languages.CSHARP;

public Languages Language        {get{return this.language;}set{this.language=value;}        }

    }}

这个时候你只要保证XML文件和exe或者数据集(如果你打算这样做)在同一个目录就可以了,看看吧下面就是测试效果:

呵呵 很简单哦,看样子写个C语言编辑环境也不是很难哦 呵呵~

我尝试去掉API在MONO上面编译,可惜MONO并没有支持RichTextBox控件,既然只能在Win上面运行,所以还是加上API好了,可以减少屏幕闪动感觉.

转载:: http://tb.blog.csdn.net/TrackBack.aspx?PostId=549896

RichTextBox实现关键字自定义颜色显示(C#)相关推荐

  1. java 过滤关键字 自定义字典库

    使用SensitiveWord方法进行过滤 以下为过滤demo public class SensitiveWord {private StringBuilder replaceAll;//初始化pr ...

  2. java根据wait,notify,synchronize关键字自定义队列

    2019独角兽企业重金招聘Python工程师标准>>> 这里定义了一个有界队列 ,保证先进先出,在队列达到上限时应该阻塞,直到队列有元素被取出才能继续往里继续添加 完整代码: pac ...

  3. 自定义颜色显示填报时校验出错的数据

    润乾填报表可以设定数据提交前的校验规则,不满足规则的数据,除了可以弹出提示信息外,还可以在填报数据的页面以特殊颜色标识出错数据,默认使用红色,当然也可以根据需要自定义颜色. 首先我们看一下设置校验后, ...

  4. JS自定义元素节点/属性的使用 createElement、setAttribute、getAttribute、appendChild

    文章目录 自定义元素节点/属性 如何创建 创建元素节点 自定义元素属性 实列:创建一个input框在指定的盒子里 如果想要添加到指定的盒子之后可以使用转到父节点追加 自定义元素节点/属性 顾名思义,自 ...

  5. SpringBoot学习之旅(七)---JPA进阶篇之自定义查询、修改、分页

    文章目录 前言 源码下载 其他文章 查询关键字 自定义Select和Update 分页及自定义分页 自定义分页 分页查询的业务代码 前言 前一节SpringBoot学习之旅(六)-JPA操作MySql ...

  6. Linux中常见shell命令总结

    1.具体的shell命令用法可以通过help或man命令进入手册来查询其具体的用法. 2.终端本质上对应着linux上的/dev/tty设备,linux的多用户登录就是通过不同的/dev/tty设备完 ...

  7. C# WinForm开发系列 - TextBox

    包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 1.CalculatorBox    CalculatorBox. ...

  8. 艾伟_转载:C# WinForm开发系列 - TextBox

    包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 1.CalculatorBox    CalculatorBox. ...

  9. Linux_Learning_兄弟连

    兄弟连Linux学习笔记,用于个人查阅复习使用 安装deb:sudo dpkg -i <filename.deb> 文件目录列举:ls -a 截屏快捷键:Ctrl + Shfit + Pr ...

最新文章

  1. CSS 和 JS 动画哪个更快
  2. Linux 之父归来!
  3. 常见电子元件实物照片
  4. 如何在SQL Server中使用触发器
  5. Linux 服务器带宽异常跑满分析解决
  6. 经典英语口语,不得不看(推荐)
  7. eclipse远程连接hadoop_hadoop集群搭建详细方法
  8. eclipse中run运行不了_使用Eclipse编写第一个Java程序HelloWorld
  9. 论文阅读-语义分割(2021)-BiSeNetV3:重新思考用于实时语义分割的BiSeNet模型
  10. UltraISO 对光盘镜像常用操作方法图解
  11. 近远场转换算法matlab,计算电磁学之FDTD算法的MATLAB语言实现解析.doc
  12. Win7 x64无法安装VS2010 SP1包解决方法
  13. xinput1_3.dll丢失怎么修复win10_有什么好的修复方法推荐?
  14. 以逗号为分隔符对字符串进行分隔
  15. 切线和倒数_原函数的导数和反函数的导数为什么是倒数关系
  16. python应用如何实现升级_基于esky实现python应用的自动升级详解
  17. 我国超级计算机型号,中国成功研制千万亿次超级计算机天河一号
  18. 人脸皮肤高清xyz贴图库分享
  19. 播放器smplayer的各种键盘快捷键
  20. 跟着sleep看jvm线程变化

热门文章

  1. js 倒计时 时间戳
  2. 从指定文件夹里COPY指定的一批文件列表(TXT文件)
  3. 给用户培训的几点感受
  4. 拆卸台式电脑主机,cpu,硬盘,内存条等
  5. onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!
  6. layui table 字体大小_layui table设置某一行的字体颜色方法
  7. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法
  8. linux 代码获取当前路径,【linux】shell代码,获取当前路径,创建文件夹
  9. 为了探究不同光照处理_渭南市实验初中“诱思探究学导”课堂教学改革展示活动圆满成功...
  10. php 签名开发,BOS签名算法的PHP demo