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
原创粉丝点击