RichTextBox着色与着色不闪
近来写的一个数据查询分析器意外的快捷,不到两晚工夫就搞定了。完成度相当的高。当然少不了关键字着色,不过着色的代码来自的网上,看了一下感觉过多的循环
//文本框改变事件
int index = this.richTextBox1.SelectionStart; //记录修改的位置
string[] keystr ={ "select ", "from ", "where ", " and ", " or ", " order ", " by ", " desc ", " when ", " case ",
" then ", " end ", " on ", " in ", " is ", " as ", " else ", "left ", " join ", " not ", " null "," like "," exists " };
for (int i = ; i < keystr.Length; i++)
this.getbunch(keystr[i], this.richTextBox1.Text, Color.Blue); public int getbunch(string p, string s,Color pColor) //给关键字上色
{
int cnt = ; int M = p.Length; int N = s.Length;
char[] ss = s.ToCharArray(), pp = p.ToCharArray();
if (M > N) return ;
for (int i = ; i < N - M + ; i++)
{
int j;
for (j = ; j < M; j++)
{
if (ss[i + j] != pp[j]) break;
}
if (j == p.Length)
{
this.richTextBox1.Select(i, p.Length);
this.richTextBox1.SelectionColor = pColor;
cnt++;
}
}
return cnt;
}
且关键字的边界也没有处理好。于是重新组织了判断关键字的代码,总的流程是先记录所有关键字及其所用颜色。从头到到尾取出每一个单词着色,以下是主体代码
/// <summary>
/// 着色
/// </summary>
public void RunColor()
{
this.BeginUpdate();//停止绘制
//文本框改变事件
int lastIndex = this.SelectionStart; //记录修改的位置 int index =;
int wordStart=-;//找到的单词开始位置
char[] text = this.Text.ToCharArray();//打散每一个字符
StringBuilder sb = new StringBuilder();
//尝试取出每一个单词
while(index<text.Length)
{
char chk = text[index];
if (WhiteSpaceChars.Contains(chk))//是否空白字符
{
if (wordStart >= )
{
//取出单词
string code = sb.ToString();
colorWords(code.ToLower(), wordStart);
wordStart = -;
}
else
{
//空白字符,未找到词开头,不需作任何处理
}
}
else
{
//找到非空白字符
if (wordStart == -)//找到词开头了。
{
sb = new StringBuilder();
wordStart = index;
}
sb.Append(chk);
}
index++;//下一字符
}
if (sb.Length > && wordStart>=)//最后一个词
{
string code = sb.ToString();
colorWords(code.ToLower(),wordStart);
}
this.Select(lastIndex, ); //返回修改的位置
this.SelectionColor = Color.Black;
this.EndUpdate();//恢复绘制事件
}
以下是完整的RichTextbox的代码,解决着色不闪。着色方法RunColor需要外部调用,控件不会自动着色。
public class MyRichTextBox : RichTextBox
{
//private class paintHelper : Control
//{
// public void DefaultWndProc(ref Message m)
// {
// this.DefWndProc(ref m);
// }
//} private const int WM_PAINT = 0x000F;
private int lockPaint;
private bool needPaint;
//private paintHelper pHelp = new paintHelper(); public void BeginUpdate()
{
lockPaint++;
} public void EndUpdate()
{
lockPaint--;
if (lockPaint <= )
{
lockPaint = ;
if (needPaint)
{
this.Refresh();
needPaint = false;
}
}
} protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PAINT:
if (lockPaint <= )
{
base.WndProc(ref m);
}
else
{
needPaint = true;
//pHelp.DefaultWndProc(ref m);
}
return;
} base.WndProc(ref m);
} Dictionary<string, Color> words = new Dictionary<string, Color>();
/// <summary>
/// 设置字符颜色
/// </summary>
/// <param name="pWords">关键字</param>
/// <param name="pColor">所用颜色</param>
/// <param name="isKeyWord">真时,替换之前设置的颜色。否的话,如果已设置相关关键字,忽略该设置</param>
public void SetColorWord(IEnumerable<string> pWords, Color pColor,bool isKeyWord)
{
foreach (string one in pWords)
{
string low = one.ToLower();
if (words.ContainsKey(low))
{
if (isKeyWord)
words[low] = pColor;
}
else
{
words.Add(low, pColor);
}
}
}
/// <summary>
/// 着色
/// </summary>
public void RunColor()
{
this.BeginUpdate();//停止绘制
//文本框改变事件
int lastIndex = this.SelectionStart; //记录修改的位置 int index =;
int wordStart=-;//单词的开始位置
char[] text = this.Text.ToCharArray();//打散每一个字符
StringBuilder sb = new StringBuilder();
//尝试取出每一个单词
while(index<text.Length)
{
char chk = text[index];
if (WhiteSpaceChars.Contains(chk))//是否空白字符
{
if (wordStart >= )//空白字符,前面已找到单词的开始位置,这就是单词的结束了
{
//取出音词
string code = sb.ToString();
colorWords(code.ToLower(), wordStart);
wordStart = -;
}
else
{
//空白字符,未找到词开头,不需作任何处理
}
}
else
{
//找到非空白字符
if (wordStart == -)//找到词开头了。
{
sb = new StringBuilder();
wordStart = index;
}
sb.Append(chk);
}
index++;//下一字符
}
if (sb.Length > && wordStart>=)//最后一个词
{
string code = sb.ToString();
colorWords(code.ToLower(),wordStart);
}
this.Select(lastIndex, ); //返回修改的位置
this.SelectionColor = Color.Black;
this.EndUpdate();//恢复绘制事件
}
/// <summary>
/// 给单词着色,非关键字改为黑色
/// </summary>
/// <param name="pChkWord"></param>
/// <param name="pStart"></param>
private void colorWords(string pChkWord,int pStart)
{
this.Select(pStart, pChkWord.Length);
if (words.ContainsKey(pChkWord))
this.SelectionColor = words[pChkWord];
else
this.SelectionColor = Color.Black;
}
/// <summary>
/// 空白字符
/// </summary>
public static readonly char[] WhiteSpaceChars = new char[] { (char)0x00, (char)0x01, (char)0x02, (char)0x03, (char)0x04, (char)0x05,
(char)0x06, (char)0x07, (char)0x08, (char)0x09, (char)0x0a, (char)0x0b, (char)0x0c, (char)0x0d, (char)0x0e, (char)0x0f,
(char)0x10, (char)0x11, (char)0x12, (char)0x13, (char)0x14, (char)0x15, (char)0x16, (char)0x17, (char)0x18, (char)0x19, (char)0x20,
(char)0x1a, (char)0x1b, (char)0x1c, (char)0x1d, (char)0x1e, (char)0x1f, (char)0x7f, (char)0x85, (char)0x2028, (char)0x2029 };
}
RichTextBox着色与着色不闪的更多相关文章
- 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化
翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化 翻译自: Exploring GLSL – Normal Visualizer with Geometry Shaders (Shader ...
- [WebGL入门]二十四,补色着色
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...
- Android Tint着色与帧动画结合
需求 最近遇到一个需求: 要求根据后台接口给的色值 显示不同色值的帧动画(UI给了三张透明色的图) 正常的帧动画 是配置在xml里三张静态图片 然后加载一下就完事了现有的静态图片是透明的 还没有填充颜 ...
- WebGL之延迟着色
什么是延迟着色(Deferred Shading)?它是相对于正常使用的正向着色(Forward Shading)而言的,正向着色的工作模式:遍历光源,获取光照条件,接着遍历物体,获取物体的几何数据, ...
- 3.QOpenGLWidget-通过着色器来渲染渐变三角形
在上章2.通过QOpenGLWidget绘制三角形,我们学习绘制三角形还是单色的,本章将为三角形每个顶点着色. 1.着色器描述 着色器的开头总是要声明版本,接着是输入和输出变量.uniform和m ...
- [No0000196]一文读懂Java 11的ZGC为何如此高效
导读:GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC ...
- JDK11 | 第七篇 : ZGC 垃圾收集器
一.简介 Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间. 在本文中,我们将介绍开发新GC的动机,技术概述以及由ZGC开启的一些可能性. ...
- 一语道破Java 11的ZGC为何如此高效
GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC是否可 ...
随机推荐
- linux学习笔记--NFS
NFS分为客户端,服务端.客户端要访问服务端,要写从RPC服务获得端口. 整个流程分为: 1,服务端rpc服务先启动2,nfs服务把端口上报给rpc服务3,rpc客户端通过服务端的rpcbind拿到访 ...
- I/O流——File类及使用
I/O框架介绍 I/O是计算机输入/输出的接口.Java的核心库java.io提供了全方面的I/O接口,包括:文件系统的操作,文件读写,标准设备的输出等. File类及使用 ① 一个File类的对 ...
- Linux系统中配置jdk
在Linux系统下安装jdk 1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...
- laravel中日志为daily时如何设置最大保存天数
在laravel中,日志设置为daily时,默认保存七天的日志,超过则清除七天前的日志.可修改默认的设置,假如要保存30天的日志,则配置如下: 在配置文件config/app.php中添加如下代码: ...
- java多线程详解(8)-volatile,Atomic比较
在变成过程中我们需要保证变量的线程安全,在java中除了使用锁机制或者Threadlocal等保证线程安全,还提供了 java.util.concurrent.atomic.Atomic*(如Atom ...
- 【随笔】从gitHub上获取源码
有时候,需要从gitHub上获取源码,下面介绍几个方法: 1.获取链接: 打开gitHub代码库的页面,能在右边看到这个: 点击红圈里的标记,该链接就会复制下来. 然后,如果安装了小乌龟(Tortoi ...
- UISegmentedControl 控件
一.创建 UISegmentedControl* mySegmentedControl = [[UISegmentedControl alloc]initWithItems:nil]; 是不是很奇怪没 ...
- C#中的问号
本人转载自: ①http://msdn.microsoft.com/zh-cn/practices/dd391752.aspx ②http://jhxk.iteye.com/blog/439888 在 ...
- NI Labview 将图形化系统设计用于肿瘤治疗
NI Labview 将图形化系统设计用于肿瘤治疗 - Jeff Stevens, Sanarus 挑战:在严格的规则条例范围内保持设计过程的情况下,为通过FDA认证的等级II医疗设备进行设计.原型并 ...
- spring aop实现
Spring 有如下两种选择来定义切入点和增强处理. 基于 Annotation 的"零配置"方式:使用@Aspect.@Pointcut等 Annotation 来标注切入点和增 ...