开发CuteMySQL/CuteSqlite开源客户端的时候,需要使用Scintilla编辑器,来高亮显示SQL语句,作为C/C++领域最成熟稳定又小巧的开源编辑器,Scintilla提供了强大的功能,wxWidgets对Scintilla进行包装后的是控件类:wxStyledTextCtrl。下面我们用正确的姿势来打开使用它。
先看下效果:
我们对该SQL编辑器的需求是:
1.显示行号
2.SQL语法高亮
3.输入SQL智能提示
4.适配DARK风格
好的,我们直接看下源码,程序员还是代码说话,其他都是废话,不多说了。
一、声明wxStyledTextCtrl的子类QSqlEditor
#pragma once
#include <wx/stc/stc.h>
#include <vector>
class QSqlEditor : public wxStyledTextCtrl
{
...
// 重要函数一:初始化编辑器,适配SQL语法,高亮,行号等
void setupSqlSyntax(int nSize, const char* face);
// 重要函数二:自动弹出智能提示,参数tags为表名,视图,字段名,函数,存储过程等
void autoShow(const std::vector<std::string> & tags);
// 重要函数三:自动替换光标当前单词
void autoReplaceWord();
private:
...
...
};
二、初始化编辑器,适配SQL语法
void QSqlEditor::setupSqlSyntax(int nSize, const char* face)
{
// - lex setup (lex语法解释器配置)
SetLexer(wxSTC_LEX_SQL); // 选择SQL解释器
// Divide each styling byte into lexical class bits (default: 5) and indicator
// bits (default: 3). If a lexer requires more than 32 lexical states, then this
// is used to expand the possible states.
// 将每个样式字节划分为词法类位(默认值:5)和指示符位(默认值:3)。
// 如果词法分析器需要超过 32 个词法状态,则用于扩展可能的状态。
// SetStyleBitsEx(5);
StyleSetForeground(wxSTC_STYLE_DEFAULT, wxColour(255, 0, 0)); // 编辑器的文本默认的前景色(文本默认的颜色)
StyleSetBackground(wxSTC_STYLE_DEFAULT, bkgColor); // 编辑器默认的背景色
StyleClearAll(); // 清理编辑器所有的样式
// - Other
SetIndent(4); // 缩进4字符
SetIndentationGuides(wxSTC_IV_LOOKBOTH); // 显示或隐藏缩进参考线
UsePopUpEx(true); // 设置当用户在某些区域上按错鼠标按钮时是否自动显示弹出菜单
// Error marker
MarkerDefine(0, wxSTC_MARK_ARROW); // 设置用于箭头标记编号的符号,以及(可选)前景色(第三参数)和背景色(第四参数)
MarkerSetBackground(0, wxColour(255, 255, 255)); // 设置第0个Marker的背景色
MarkerSetForeground(0, wxColour(0, 0, 0)); // 设置第0个Marker的前景色