RichTextBox实现关键字自定义颜色显示(C#)
现在的很多编辑工具都能实现代码中关键字的高亮显示,自己一时好玩也就随便写了一个:
首先建立一个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#)相关推荐
- java 过滤关键字 自定义字典库
使用SensitiveWord方法进行过滤 以下为过滤demo public class SensitiveWord {private StringBuilder replaceAll;//初始化pr ...
- java根据wait,notify,synchronize关键字自定义队列
2019独角兽企业重金招聘Python工程师标准>>> 这里定义了一个有界队列 ,保证先进先出,在队列达到上限时应该阻塞,直到队列有元素被取出才能继续往里继续添加 完整代码: pac ...
- 自定义颜色显示填报时校验出错的数据
润乾填报表可以设定数据提交前的校验规则,不满足规则的数据,除了可以弹出提示信息外,还可以在填报数据的页面以特殊颜色标识出错数据,默认使用红色,当然也可以根据需要自定义颜色. 首先我们看一下设置校验后, ...
- JS自定义元素节点/属性的使用 createElement、setAttribute、getAttribute、appendChild
文章目录 自定义元素节点/属性 如何创建 创建元素节点 自定义元素属性 实列:创建一个input框在指定的盒子里 如果想要添加到指定的盒子之后可以使用转到父节点追加 自定义元素节点/属性 顾名思义,自 ...
- SpringBoot学习之旅(七)---JPA进阶篇之自定义查询、修改、分页
文章目录 前言 源码下载 其他文章 查询关键字 自定义Select和Update 分页及自定义分页 自定义分页 分页查询的业务代码 前言 前一节SpringBoot学习之旅(六)-JPA操作MySql ...
- Linux中常见shell命令总结
1.具体的shell命令用法可以通过help或man命令进入手册来查询其具体的用法. 2.终端本质上对应着linux上的/dev/tty设备,linux的多用户登录就是通过不同的/dev/tty设备完 ...
- C# WinForm开发系列 - TextBox
包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 1.CalculatorBox CalculatorBox. ...
- 艾伟_转载:C# WinForm开发系列 - TextBox
包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 1.CalculatorBox CalculatorBox. ...
- Linux_Learning_兄弟连
兄弟连Linux学习笔记,用于个人查阅复习使用 安装deb:sudo dpkg -i <filename.deb> 文件目录列举:ls -a 截屏快捷键:Ctrl + Shfit + Pr ...
最新文章
- CSS 和 JS 动画哪个更快
- Linux 之父归来!
- 常见电子元件实物照片
- 如何在SQL Server中使用触发器
- Linux 服务器带宽异常跑满分析解决
- 经典英语口语,不得不看(推荐)
- eclipse远程连接hadoop_hadoop集群搭建详细方法
- eclipse中run运行不了_使用Eclipse编写第一个Java程序HelloWorld
- 论文阅读-语义分割(2021)-BiSeNetV3:重新思考用于实时语义分割的BiSeNet模型
- UltraISO 对光盘镜像常用操作方法图解
- 近远场转换算法matlab,计算电磁学之FDTD算法的MATLAB语言实现解析.doc
- Win7 x64无法安装VS2010 SP1包解决方法
- xinput1_3.dll丢失怎么修复win10_有什么好的修复方法推荐?
- 以逗号为分隔符对字符串进行分隔
- 切线和倒数_原函数的导数和反函数的导数为什么是倒数关系
- python应用如何实现升级_基于esky实现python应用的自动升级详解
- 我国超级计算机型号,中国成功研制千万亿次超级计算机天河一号
- 人脸皮肤高清xyz贴图库分享
- 播放器smplayer的各种键盘快捷键
- 跟着sleep看jvm线程变化
热门文章
- js 倒计时 时间戳
- 从指定文件夹里COPY指定的一批文件列表(TXT文件)
- 给用户培训的几点感受
- 拆卸台式电脑主机,cpu,硬盘,内存条等
- onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!
- layui table 字体大小_layui table设置某一行的字体颜色方法
- nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法
- linux 代码获取当前路径,【linux】shell代码,获取当前路径,创建文件夹
- 为了探究不同光照处理_渭南市实验初中“诱思探究学导”课堂教学改革展示活动圆满成功...
- php 签名开发,BOS签名算法的PHP demo