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是否可 ...
随机推荐
- 写css时要注意数字的浮动方向
写css时要注意数字的浮动方向 当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;
- ios调用系统相册、相机 显示中文标题、本地化多语言支持
因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...
- keepalived+nginx高可用负载均衡环境搭建
上篇说道keepalived的环境搭建,本来keepalived结合lvs更有优势,但是也可以结合nginx来使用.下面接着说下nginx的环境搭建 环境信息: nginx(master) 192. ...
- ANDROID开发之问题积累及解决方案(二)
错误:“Binary XML file line # : Error inflating class” 原因:此异常是布局文件中有错引起的,那么返回到布局文件中看看. <?xml version ...
- SQL Server 2008 通用分页存储过程
1.alert USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[dbTab_PagerHelper] Script Date: 08/22/ ...
- C#字符串操作(參照圓友)
直接上實例代碼 staticvoid Main(string[] args) { string s =""; //(1)字符访问(下标访问s[i]) s ="ABCD&q ...
- CodeFirst进行数据迁移之添加字段
一.为模型更改设置 Code First 数据迁移 1.工具->库程序包管理器->程序包管理器控制台->输入"Enable-Migrations" 或者 Ena ...
- 图片缩放应用(nearest / bilinear / three-order interpolate)
typedef xPixel PIXELCOLORRGB; double Sinxx(double value){ if (value < 0) value = -value; if (valu ...
- js+cookie 购物车
$(function () { //var ctx = new Ch(); //ctx.Clear(); //$.cookie(ctx.cookieName, ""); //ale ...
- Javascript.ReactNative-2-javascript-syntax-in-react-native
JavaScript Syntax in React Native Contents: Arrow Function Let+Const Default + Rest + Spread Destruc ...