Scintilla笔记(2)
来源:互联网 发布:淘宝咖啡猫游戏代购 编辑:程序博客网 时间:2024/06/03 17:40
Scintilla笔记(2)
Scintilla支持语法高亮
要支持语法高亮,分为三个步骤:
一、选定语法解析器
语法解析器用于把代码分为一个个单词(token),另外,还用于代码折叠控制等。
Scintilla作为源码编辑器支持非常多的语言,如C/C++、Java、SQL、HTML、Structured Text(ST)等等。
//Setup the Lexer,非常重要,否则会影响折叠,高亮等等功能。
std::string st_keywords = ui_st_driver::GetStLanguageKeywordStr();
m_ScintillaEdit.SetLexer(SCLEX_CPP); //设置语言,此处设置为C++语言
m_ScintillaEdit.SetKeyWords(0, U8ToU16(st_keywords).c_str());//设置Scintilla的语言关键字
除了使用SCI_SETLEXER外,还可以使用SCI_SETLEXERLANGUAGE命令,如:
m_ScintillaEdit.SetLexerLanguage("cpp");
接受一个字符串参数,这个字符串定义于代码解析器源码(src\lexcpp.cxx)。
二、设置关键字
语法解析只负责把代码拆分开,至于哪些是关键字,还得我们来指定。
这种方式带来了些许的灵活性,比如我们要高亮一种自定义的语言,这种语言的风格与C++类似(如Java、C#、php等),我们也 可以选定SCLEX_CPP作为语法解析器,然后定义自己的关键字。(所以不需要把各种解析器都编译进DLL文件里)
设置关键字的命令是SCI_SETKEYWORDS。它的wParam用于指定关键字种类,可以是0~8即9种类型,这样我们可以做 更细致的区分,如把关键字for if和int bool区分显示。lParam指定关键字,以空格分隔。
三、设置文本元素对应的字体风格
设置高亮的字体、前景色、背景色、斜体、粗体等。
m_ScintillaEdit.StyleSetFore(STYLE_DEFAULT, 0);
m_ScintillaEdit.StyleSetBack(STYLE_DEFAULT, clr_back);
m_ScintillaEdit.StyleSetSize(STYLE_DEFAULT, 10);
m_ScintillaEdit.StyleSetFont(STYLE_DEFAULT, L"Courier New");
//Setup the Lexer
std::string st_keywords = ui_st_driver::GetStLanguageKeywordStr();
m_ScintillaEdit.SetLexer(SCLEX_STTXT);
m_ScintillaEdit.SetKeyWords(0, U8ToU16(st_keywords).c_str());
const COLORREF keyword_color = RGB(0, 0, 255);
const COLORREF type_color = RGB(255, 0, 0);
const COLORREF string_color = RGB(0, 255, 0);
const COLORREF comment_color = RGB(0, 128, 0);
const COLORREF num_color = RGB(0, 128, 128);
const COLORREF operator_color = RGB(128, 128, 0);
const COLORREF fb_color = RGB(0, 0, 128);
const COLORREF pargma_color = RGB(128, 0, 0);
const COLORREF default_color = 0;
const COLORREF string2_color = RGB(0, 0, 255);
//文字颜色
struct TextColor
{
int TextType;
COLORREF color;
};
TextColor LexerColors[] =
{
// 根据不同的词法解析器设置不同的宏,格式为SCE_xx语言_KEYWORD等等
{ SCE_STTXT_DEFAULT, default_color, },
{ SCE_STTXT_KEYWORD, keyword_color, }, //关键字
{ SCE_STTXT_TYPE, value_color, }, //类型关键字
{ SCE_STTXT_DATETIME, date_color, }, //日期
{ SCE_STTXT_STRING1, string_color, }, //字符串
{ SCE_STTXT_STRING2, string_color, },
{ SCE_STTXT_STRINGEOL, string_color, },
{ SCE_STTXT_CHARACTER, string_color, },
{ SCE_STTXT_COMMENT, comment_color, }, //注释
{ SCE_STTXT_COMMENTLINE, comment_color, },
{ SCE_STTXT_NUMBER, value_color, }, //数字
{ SCE_STTXT_OPERATOR, operator_color, }, //运算符
{ SCE_STTXT_FB, fb_color, },//FB
};
for (int i = 0; i < sizeof(LexerColors) / sizeof(LexerColors[0]); i++)
{
m_ScintillaEdit.StyleSetFore(LexerColors[i].TextType, highlight_syntax ?
LexerColors[i].color : default_color);
}
//是否显示为粗体
m_ScintillaEdit.StyleSetBold(SCE_STTXT_KEYWORD, TRUE);
0 0
- Scintilla笔记(2)
- Scintilla笔记(1)
- Scintilla笔记(3)
- Scintilla笔记(4)
- Scintilla源码剖析2
- Scintilla
- scintilla笔记(一)编译
- Scintilla使用指南(2) - 全文检索和修改
- Scintilla使用指南(2) - 全文检索和修改收藏
- Scintilla使用(编辑器篇)(2) - 全文检索和修改
- Scintilla/SciTE
- Scintilla Documentation
- Scintilla使用指南(一)
- Scintilla使用指南(二)
- Scintilla使用指南(1) - 简介
- Scintilla使用指南(二)收藏
- Scintilla使用指南(一)收藏
- Scintilla and SciTE
- Python-OpenCV人脸检测(代码)
- MySQL数据库备份与还原
- angularJs 解决跨域访问问题
- JavaBean 实现Mysql数据库操作(Query、Insert、Delete、Update)
- 19. Remove Nth Node From End of List (移除链表倒数第n个节点)
- Scintilla笔记(2)
- JDBC的学习
- OpenCV人脸检测(C++代码)—— By wepon
- POJ-1273 Drainage Ditches(最大流)
- Android 对话框弹出底部背景透明度调节
- java xml解析
- Scintilla笔记(3)
- request.getRequestURI()、getRequestURL()、getContextPath()、getServletPath()区别
- 备忘录模式(Memento Pattern)