为Scintilla加入代码折叠功能
来自http://www.cppprog.com/2009/1111/176_2.html
前面曾说过当编辑器有代码折叠功能时,25号到31号这7个标记是作为代码折叠专用标记的。在scintilla.h中,我们可以找到它们的定义:
#define SC_MARKNUM_FOLDEREND 25 //折叠状态(多级中间)
#define SC_MARKNUM_FOLDEROPENMID 26 //展开状态(多级中间)
#define SC_MARKNUM_FOLDERMIDTAIL 27 //被折叠代码块尾部(多级中间)
#define SC_MARKNUM_FOLDERTAIL 28 //被折叠代码块尾部
#define SC_MARKNUM_FOLDERSUB 29 //被折叠的代码块
#define SC_MARKNUM_FOLDER 30 //折叠状态
#define SC_MARKNUM_FOLDEROPEN 31 //展开状态
显示这些标记的掩码是0xFE000000,同样头文件里已经定义好了:
#define SC_MASK_FOLDERS 0xFE000000
要加入代码折叠功能,还有一个最最关键的事情,就是要得到语法解析器(Lexer)的支持,上面的这些标记都是由语法解析器自动添加删除的。一般来说,只要用下面这条命令就可以了让语法解析器支持代码折叠了:
SendEditor(SCI_SETPROPERTY,(sptr_t)"fold",(sptr_t)"1");
是时候上代码了:
-
#define MARGIN_FOLD_INDEX 2
-
void TForm1::setFold()
-
{
-
SendEditor(SCI_SETPROPERTY,(sptr_t)"fold",(sptr_t)"1");
-
-
SendEditor(SCI_SETMARGINTYPEN, MARGIN_FOLD_INDEX, SC_MARGIN_SYMBOL);
-
SendEditor(SCI_SETMARGINMASKN, MARGIN_FOLD_INDEX, SC_MASK_FOLDERS);
-
SendEditor(SCI_SETMARGINWIDTHN, MARGIN_FOLD_INDEX, 11);
-
SendEditor(SCI_SETMARGINSENSITIVEN, MARGIN_FOLD_INDEX, TRUE);
-
-
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_CIRCLEPLUSCONNECTED);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);
-
SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);
-
-
-
SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERSUB, 0xa0a0a0);
-
SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERMIDTAIL, 0xa0a0a0);
-
SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERTAIL, 0xa0a0a0);
-
-
SendEditor(SCI_SETFOLDFLAGS, 16|4, 0);
-
}
-
__fastcall TForm1::TForm1(TComponent* Owner)
-
: TForm(Owner)
-
{
-
...
-
setFold();
-
}
-
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
-
{
-
TForm::WndProc(Message);
-
-
if(Message.Msg == WM_NOTIFY){
-
SCNotification* notify = (SCNotification*)Message.LParam;
-
if(notify->nmhdr.code == SCN_MARGINCLICK &&
-
notify->nmhdr.idFrom == SCINT_ID){
-
-
const int line_number = SendEditor(SCI_LINEFROMPOSITION,notify->position);
-
SendEditor(SCI_TOGGLEFOLD, line_number);
-
}
-
}
-
}
现在的效果
}
相关推荐
9. **代码折叠**:通过自定义QTextEdit的行为,可以实现代码折叠功能,隐藏和显示代码块,提高代码阅读性。 10. **设置和偏好**:为了满足用户个性化需求,可以添加设置菜单,让用户调整编辑器的颜色主题、字体大小...
Scintilla是一款开源的文本编辑组件,拥有强大的语法高亮、自动完成、代码折叠等功能,是许多专业IDE的选择。它的加入使得uCStudio在代码编辑体验上达到业界一流水平。 3. **单片机支持**:作为一个专业的单片机...
6. **缩进与代码折叠**:为了增强代码可读性,我们需要支持代码缩进和折叠。这可以通过监听用户输入事件,调整Tab和Shift+Tab的行为,以及实现折叠按钮和逻辑来完成。 7. **语法检测**:虽然这不是Sublime Text的...
Notepad++本身是一款广受欢迎的轻量级源代码编辑器,支持多种编程语言,具有语法高亮、代码折叠、宏录制等功能,而Androidlogger插件的加入,进一步增强了其在Android开发中的实用性。 【描述】"直接下载解压,可用...
QScintilla 是一个基于 Scintilla 的文本编辑组件,常用于集成到开发环境中,提供语法高亮、代码折叠等特性。Python-Qt 模块则通常是指 PyQt 或 PySide,它是 Python 与 Qt 框架之间的桥梁,使得 Python 开发者能够...