近来写的一个数据查询分析器意外的快捷,不到两晚工夫就搞定了。完成度相当的高。当然少不了关键字着色,不过着色的代码来自的网上,看了一下感觉过多的循环

//文本框改变事件    
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着色与着色不闪的更多相关文章

  1. 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化

    翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化 翻译自: Exploring GLSL – Normal Visualizer with Geometry Shaders (Shader ...

  2. [WebGL入门]二十四,补色着色

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  3. OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...

  4. Android Tint着色与帧动画结合

    需求 最近遇到一个需求: 要求根据后台接口给的色值 显示不同色值的帧动画(UI给了三张透明色的图) 正常的帧动画 是配置在xml里三张静态图片 然后加载一下就完事了现有的静态图片是透明的 还没有填充颜 ...

  5. WebGL之延迟着色

    什么是延迟着色(Deferred Shading)?它是相对于正常使用的正向着色(Forward Shading)而言的,正向着色的工作模式:遍历光源,获取光照条件,接着遍历物体,获取物体的几何数据, ...

  6. 3.QOpenGLWidget-通过着色器来渲染渐变三角形

    在上章2.通过QOpenGLWidget绘制三角形,我们学习绘制三角形还是单色的,本章将为三角形每个顶点着色.   1.着色器描述 着色器的开头总是要声明版本,接着是输入和输出变量.uniform和m ...

  7. [No0000196]一文读懂Java 11的ZGC为何如此高效

    导读:GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC ...

  8. JDK11 | 第七篇 : ZGC 垃圾收集器

    一.简介 Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间. 在本文中,我们将介绍开发新GC的动机,技术概述以及由ZGC开启的一些可能性. ...

  9. 一语道破Java 11的ZGC为何如此高效

    GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC是否可 ...

随机推荐

  1. Linux QT

    Check system version 1.  cat /proc/version mike@sp-ThinkPad-X220:~$ cat /proc/versionLinux version 3 ...

  2. spark streaming 对接kafka记录

    spark streaming 对接kafka 有两种方式: 参考: http://group.jobbole.com/15559/ http://blog.csdn.net/kwu_ganymede ...

  3. ubuntu 搭建PPTP VPN服务器

    上一篇文章介绍了如何在Ubuntu服务器上搭建IPSEC L2TP VPN服务器.继续介绍如何在Ubuntu服务器上搭建PPTP VPN服务器. 首先安装以下所需包 #apt-get install ...

  4. JSP开发模式2(计算器)

    CalculatorBean———————————————————————————————————————————— public class CalculatorBean {    private ...

  5. PLL失锁

    2016-07-05 现象:在低温(-30度以下)下,射频锁定信号出现周(大约20ms)期性高低电平的变化,由于MCU检测一次需要的时间很长(大于500ms), 大概总是检测不到失锁状态,所以不会出现 ...

  6. poj 2594 Treasure Exploration (二分匹配)

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 6558   Accepted: 2 ...

  7. Codeforces Round #385 //再遇状压

    敲完三题挂机一小时.....  也没懂DE什么意思  rank600上了一波分... A. Hongcow Learns the Cyclic Shift 给一个字符串,每次可以把最后一个字符拿到开头 ...

  8. UiAutomator自动化测试框架介绍

    UiAutomator自动化测试框架介绍 环境搭建 1         必要条件 1.1       JDK 1.2       SDK(API高于15) 1.3       Eclipse 2    ...

  9. spark 运行问题记录

    在CDH5.5.2上运行spark1.5的程序,运行起来就直接shutdown,并报出如下的异常:  INFO YarnClientSchedulerBackend: SchedulerBackend ...

  10. LSD-SLAM深入学习(3)-代码解析

    前言 在LSD-SLAM深入学习(2)中我们已经对算法进行分析,此处假设读者对于ros的基本操作都已经很熟悉,而且已经编写了一定量的的代码,我们直接上干货.此处分析的程序如下 main_live_od ...