DevExpress控件-RichEditControl文本高亮显示(图文)
来源:互联网 发布:免费域名转发 编辑:程序博客网 时间:2024/05/20 18:52
需要引用的DLL
DevExpress.CodeParser
DevExpress.Office
DevExpress.RichEdit
DevExpress.XtraRichEdit
MySyntaxHighlightServiceCSharp类
using System.Collections.Generic;using System.Drawing;using DevExpress.CodeParser;using DevExpress.LookAndFeel;using DevExpress.Office.Utils;using DevExpress.Skins;using DevExpress.XtraRichEdit;using DevExpress.XtraRichEdit.API.Native;using DevExpress.XtraRichEdit.Services;namespace DBMT.Control.RichText{ /// <summary> /// This class implements the Execute method of the ISyntaxHighlightService interface to parse and colorize the text. /// </summary> public class MySyntaxHighlightServiceCSharp : ISyntaxHighlightService { readonly RichEditControl syntaxEditor; SyntaxColors syntaxColors; SyntaxHighlightProperties commentProperties; SyntaxHighlightProperties keywordProperties; SyntaxHighlightProperties stringProperties; SyntaxHighlightProperties xmlCommentProperties; SyntaxHighlightProperties textProperties; public MySyntaxHighlightServiceCSharp(RichEditControl syntaxEditor) { this.syntaxEditor = syntaxEditor; syntaxColors = new SyntaxColors(UserLookAndFeel.Default); } void HighlightSyntax(TokenCollection tokens) { commentProperties = new SyntaxHighlightProperties(); commentProperties.ForeColor = syntaxColors.CommentColor; keywordProperties = new SyntaxHighlightProperties(); keywordProperties.ForeColor = syntaxColors.KeywordColor; stringProperties = new SyntaxHighlightProperties(); stringProperties.ForeColor = syntaxColors.StringColor; xmlCommentProperties = new SyntaxHighlightProperties(); xmlCommentProperties.ForeColor = syntaxColors.XmlCommentColor; textProperties = new SyntaxHighlightProperties(); textProperties.ForeColor = syntaxColors.TextColor; if (tokens == null || tokens.Count == 0) return; Document document = syntaxEditor.Document; //CharacterProperties cp = document.BeginUpdateCharacters(0, 1); List<SyntaxHighlightToken> syntaxTokens = new List<SyntaxHighlightToken>(tokens.Count); foreach (Token token in tokens) { HighlightCategorizedToken((CategorizedToken)token, syntaxTokens); } document.ApplySyntaxHighlight(syntaxTokens); //document.EndUpdateCharacters(cp); } void HighlightCategorizedToken(CategorizedToken token, List<SyntaxHighlightToken> syntaxTokens) { Color backColor = syntaxEditor.ActiveView.BackColor; TokenCategory category = token.Category; if (category == TokenCategory.Comment) syntaxTokens.Add(SetTokenColor(token, commentProperties, backColor)); else if (category == TokenCategory.Keyword) syntaxTokens.Add(SetTokenColor(token, keywordProperties, backColor)); else if (category == TokenCategory.String) syntaxTokens.Add(SetTokenColor(token, stringProperties, backColor)); else if (category == TokenCategory.XmlComment) syntaxTokens.Add(SetTokenColor(token, xmlCommentProperties, backColor)); else syntaxTokens.Add(SetTokenColor(token, textProperties, backColor)); } SyntaxHighlightToken SetTokenColor(Token token, SyntaxHighlightProperties foreColor, Color backColor) { int paragraphStart = DocumentHelper.GetParagraphStart(syntaxEditor.Document.Paragraphs[token.Range.Start.Line - 1]); int tokenStart = paragraphStart + token.Range.Start.Offset - 1; if (token.Range.End.Line != token.Range.Start.Line) paragraphStart = DocumentHelper.GetParagraphStart(syntaxEditor.Document.Paragraphs[token.Range.End.Line - 1]); int tokenEnd = paragraphStart + token.Range.End.Offset - 1; Debug.Assert(tokenEnd > tokenStart); return new SyntaxHighlightToken(tokenStart, tokenEnd - tokenStart, foreColor); } #region #ISyntaxHighlightServiceMembers public void Execute() { string newText = syntaxEditor.Text; // Determine language by file extension. string ext = System.IO.Path.GetExtension(syntaxEditor.Options.DocumentSaveOptions.CurrentFileName); //ParserLanguageID lang_ID = ParserLanguage.FromFileExtension(ext); //// Do not parse HTML or XML. //if (lang_ID == ParserLanguageID.Html || // lang_ID == ParserLanguageID.Xml || // lang_ID == ParserLanguageID.None) return; ParserLanguageID lang_ID = ParserLanguageID.CSharp; // Use DevExpress.CodeParser to parse text into tokens. ITokenCategoryHelper tokenHelper = TokenCategoryHelperFactory.CreateHelper(lang_ID); TokenCollection highlightTokens; highlightTokens = tokenHelper.GetTokens(newText); HighlightSyntax(highlightTokens); } public void ForceExecute() { Execute(); } #endregion #ISyntaxHighlightServiceMembers } /// <summary> /// This class provides colors to highlight the tokens. /// </summary> public class SyntaxColors { static Color DefaultCommentColor { get { return Color.Green; } } static Color DefaultKeywordColor { get { return Color.Blue; } } static Color DefaultStringColor { get { return Color.Brown; } } static Color DefaultXmlCommentColor { get { return Color.Gray; } } static Color DefaultTextColor { get { return Color.Black; } } UserLookAndFeel lookAndFeel; public Color CommentColor { get { return GetCommonColorByName(CommonSkins.SkinInformationColor, DefaultCommentColor); } } public Color KeywordColor { get { return GetCommonColorByName(CommonSkins.SkinQuestionColor, DefaultKeywordColor); } } public Color TextColor { get { return GetCommonColorByName(CommonColors.WindowText, DefaultTextColor); } } public Color XmlCommentColor { get { return GetCommonColorByName(CommonColors.DisabledText, DefaultXmlCommentColor); } } public Color StringColor { get { return GetCommonColorByName(CommonSkins.SkinWarningColor, DefaultStringColor); } } public SyntaxColors(UserLookAndFeel lookAndFeel) { this.lookAndFeel = lookAndFeel; } Color GetCommonColorByName(string colorName, Color defaultColor) { Skin skin = CommonSkins.GetSkin(lookAndFeel); if (skin == null) return defaultColor; return skin.Colors[colorName]; } }}
使用:
richEditControl1.ReplaceService<ISyntaxHighlightService>(new MySyntaxHighlightServiceCSharp(richEditControl1));//高亮显示
效果:
第二种,自定义:
public class CustomSyntaxHighlightService : ISyntaxHighlightService { #region #parsetokens readonly Document document; SyntaxHighlightProperties defaultSettings = new SyntaxHighlightProperties() { ForeColor = Color.Black }; SyntaxHighlightProperties keywordSettings = new SyntaxHighlightProperties() { ForeColor = Color.Blue }; SyntaxHighlightProperties stringSettings = new SyntaxHighlightProperties() { ForeColor = Color.Green }; string[] keywords = new string[] { "INSERT", "SELECT", "CREATE", "TABLE", "USE", "IDENTITY", "ON", "OFF", "NOT", "NULL", "WITH", "SET" }; public CustomSyntaxHighlightService(Document document) { this.document = document; } private List<SyntaxHighlightToken> ParseTokens() { List<SyntaxHighlightToken> tokens = new List<SyntaxHighlightToken>(); DocumentRange[] ranges = null; // search for quotation marks ranges = document.FindAll("'", SearchOptions.None); for (int i = 0; i < ranges.Length / 2; i++) { tokens.Add(new SyntaxHighlightToken(ranges[i * 2].Start.ToInt(), ranges[i * 2 + 1].Start.ToInt() - ranges[i * 2].Start.ToInt() + 1, stringSettings)); } // search for keywords for (int i = 0; i < keywords.Length; i++) { ranges = document.FindAll(keywords[i], SearchOptions.CaseSensitive | SearchOptions.WholeWord); for (int j = 0; j < ranges.Length; j++) { if (!IsRangeInTokens(ranges[j], tokens)) tokens.Add(new SyntaxHighlightToken(ranges[j].Start.ToInt(), ranges[j].Length, keywordSettings)); } } // order tokens by their start position tokens.Sort(new SyntaxHighlightTokenComparer()); // fill in gaps in document coverage AddPlainTextTokens(tokens); return tokens; } private void AddPlainTextTokens(List<SyntaxHighlightToken> tokens) { int count = tokens.Count; if (count == 0) { tokens.Add(new SyntaxHighlightToken(0, document.Range.End.ToInt(), defaultSettings)); return; } tokens.Insert(0, new SyntaxHighlightToken(0, tokens[0].Start, defaultSettings)); for (int i = 1; i < count; i++) { tokens.Insert(i * 2, new SyntaxHighlightToken(tokens[i * 2 - 1].End, tokens[i * 2].Start - tokens[i * 2 - 1].End, defaultSettings)); } tokens.Add(new SyntaxHighlightToken(tokens[count * 2 - 1].End, document.Range.End.ToInt() - tokens[count * 2 - 1].End, defaultSettings)); } private bool IsRangeInTokens(DocumentRange range, List<SyntaxHighlightToken> tokens) { for (int i = 0; i < tokens.Count; i++) { if (range.Start.ToInt() >= tokens[i].Start && range.End.ToInt() <= tokens[i].End) return true; } return false; } #endregion #parsetokens #region #ISyntaxHighlightServiceMembers public void ForceExecute() { Execute(); } public void Execute() { document.ApplySyntaxHighlight(ParseTokens()); } #endregion #ISyntaxHighlightServiceMembers } #region #SyntaxHighlightTokenComparer public class SyntaxHighlightTokenComparer : IComparer<SyntaxHighlightToken> { public int Compare(SyntaxHighlightToken x, SyntaxHighlightToken y) { return x.Start - y.Start; } } #endregion #SyntaxHighlightTokenComparer
使用:
richEditControl1.ReplaceService<ISyntaxHighlightService>(new CustomSyntaxHighlightService(richEditControl1.Document));
效果:
我期盼真诚的忠告指点,但不代表我接受你批判性的指指点点
1 0
- DevExpress控件-RichEditControl文本高亮显示(图文)
- DX(DevExpress)RichEditControl 控件 生成导航栏,点击定位到文本
- DevExpress控件使用之RichEditControl的使用
- DevExpress控件使用之RichEditControl的使用
- DevExpress RichEditControl 书签替换
- DevExpress控件-searchControl使用方法(图文)
- DevExpress控件-ButtonEdit控件的使用(图文)
- DevExpress控件-lookupedit的使用方法详解(图文)
- DevExpress控件-TreeList+searchControl组合过滤实现(图文)
- DevExpress控件-TreeList内置过滤功能实现(图文)
- DevExpress从SpreadsheetControl拷贝粘贴到richeditcontrol
- JQuery 高亮显示文本
- DevExpress.XtraGrid自定义列显示文本
- TextView如何高亮显示文本
- TextView如何高亮显示文本
- javascript设置文本高亮显示
- RichTextBox指定文本高亮显示
- DX,DevExpress中的RichEditControl如何替换选中的文字
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-C - Bear and Up-Down-暴力枚举
- 第四周,项目5,(1)
- 第五周项目训练1 三角形1
- 推荐12个最好的 JavaScript 图形绘制库
- 【数据库】Oracle中的字符型及处理方法
- DevExpress控件-RichEditControl文本高亮显示(图文)
- listview添加了headview时刷新的问题 HeadViewAdapter.getView
- 设置一个三角形类(4)
- 第五周【项目 - 三角形类雏形2、3、4、5】
- html禁止手机页面放大缩小
- 三角类雏形3
- 20160331差评师新技能get
- 手机web——自适应网页
- 第四周,项目5,递归求解(2)