前面我们介绍了如何加载显示公式列表,本篇章介绍如何格式化显示公式内容:
常用的CEdit或CRichEdit是不支持这种格式显示的。这里需要借助第三方控件SciLexer(没错!Notepad++就是使用的这个控件),它支持不同的文本内容支持不同的颜色,以及文本内容提示和预输入功能,非常强大,如何事情这个控件,前面有单独的篇章介绍,这里就不再赘述了。
控件基本属性设置:
std::unique_ptr<CScintillaCtrl> m_pEdit;
m_pEdit = std::make_unique<CScintillaCtrl>();
const CRect rcWindow;
if (!m_pEdit->CreateFromWnd(IDC_TEXT_FORMULA, this))
return ;
// 设置全局风格
m_pEdit->StyleSetFore(STYLE_DEFAULT, globalSetting.m_clr[EC_TEXT][EK_CLOLOR]);//普通文本
m_pEdit->StyleSetFont(STYLE_DEFAULT, "Fixedsys");//默认字体名称
m_pEdit->StyleSetSize(STYLE_DEFAULT, 11);//默认字体大小
m_pEdit->StyleSetBold(STYLE_DEFAULT, FALSE);
m_pEdit->SetCodePage(SC_CP_UTF8);//设置编码为UTF-8
m_pEdit->UsePopUp(SC_POPUP_NEVER);
m_pEdit->StyleClearAll();
//语法解析
m_pEdit->SetLexer(SCLEX_META);//自定义Meta语法解析器
m_pEdit->SetKeyWords(0, globalFormula.m_pszIndicatorsFuncNames);//设置关键字-指标函数
m_pEdit->SetKeyWords(1, globalFormula.m_pszInlineFuncNames);//设置关键字-内置函数
// 下面设置各种语法元素风格
m_pEdit->StyleSetFore(SCE_META_WORD, globalSetting.m_clr[EC_INDICATOR][EK_CLOLOR]);//关键字-指标
m_pEdit->StyleSetBold(SCE_META_WORD, FALSE);//关键字-粗体
m_pEdit->StyleSetFore(SCE_META_WORD2, globalSetting.m_clr[EC_FUNCTION][EK_CLOLOR]);//关键字-函数
m_pEdit->StyleSetBold(SCE_META_WORD2, FALSE);//关键字-粗体
m_pEdit->SetSelBack(TRUE, globalSetting.m_clr[EC_SELBACK][EK_CLOLOR]);//选中背景颜色
m_pEdit->SetSelFore(TRUE, globalSetting.m_clr[EC_SELTEXT][EK_CLOLOR]);//选中文本颜色
SetAStyle(SCE_META_COMMENT, globalSetting.m_clr[EC_COMMENT][EK_CLOLOR]);//块注释
SetAStyle(SCE_META_COMMENTLINE, globalSetting.m_clr[EC_COMMENT][EK_CLOLOR]);//行注释
SetAStyle(SCE_META_NUMBER, globalSetting.m_clr[EC_NUMBER][EK_CLOLOR]);//数字
SetAStyle(SCE_META_STRING, globalSetting.m_clr[EC_STRING][EK_CLOLOR]);//字符串
SetAStyle(SCE_META_CHARACTER, globalSetting.m_clr[EC_STRING][EK_CLOLOR]);//字符
SetAStyle(SCE_META_OPERATOR, globalSetting.m_clr[EC_TEXT][EK_CLOLOR]);//操作符
m_pEdit->SetMarginTypeN(0, SC_MARGIN_NUMBER);//设置编号为0的页边显示行号
m_pEdit->SetMarginWidthN(0, 0);//设置页边宽度,默认宽度为0,即不显示行号
m_pEdit->SetMarginSensitiveN(0, FALSE); //设置页边是否接受鼠标点击事件
m_pEdit->SetMarginTypeN(0, SC_MARGIN_NUMBER);//设置编号为0的页边显示行号
m_pEdit->StyleSetFore(STYLE_LINENUMBER, globalSetting.m_clr[EC_LINENO][EK_CLOLOR]);//普通文本
m_pEdit->StyleSetBack(STYLE_LINENUMBER, globalSetting.m_clr[EC_LINENOBACK][EK_CLOLOR]);//普通文本
m_pEdit->SetMarginWidthN(1, SC_MARGIN_SYMBOL);//用于显示公式错误符号
m_pEdit->SetScintillaProperty(_T("fold"), _T("0"));//启用代码折叠功能 1-启用 0-不启用
m_pEdit->AutoCSetSeparator(10);
m_pEdit->SetMouseDwellTime(1000);
m_pEdit->SetMultipleSelection(TRUE);
//提示框背景和文字颜色
m_pEdit->CallTipSetFore(RGB(0, 0, 0));
m_pEdit->CallTipSetBack(RGB(0xFF, 0xFF, 0xD8));
//当前行高亮显示
m_pEdit->SetCaretLineVisible(TRUE);
m_pEdit->SetCaretLineBack(RGB(0xFF, 0xFF, 0xD8));
//TAB宽度由默认的8改为4
m_pEdit->SetTabWidth(4);