Scintilla笔记(2)

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);
 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部