`

为Scintilla加入代码折叠功能

阅读更多

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

是时候上代码了:

  1. #define MARGIN_FOLD_INDEX 2
  2. void TForm1::setFold()
  3. {
  4.     SendEditor(SCI_SETPROPERTY,(sptr_t)"fold",(sptr_t)"1");
  5.  
  6.     SendEditor(SCI_SETMARGINTYPEN, MARGIN_FOLD_INDEX, SC_MARGIN_SYMBOL);//页边类型
  7.     SendEditor(SCI_SETMARGINMASKN, MARGIN_FOLD_INDEX, SC_MASK_FOLDERS); //页边掩码
  8.     SendEditor(SCI_SETMARGINWIDTHN, MARGIN_FOLD_INDEX, 11); //页边宽度
  9.     SendEditor(SCI_SETMARGINSENSITIVEN, MARGIN_FOLD_INDEX, TRUE); //响应鼠标消息
  10.  
  11.     // 折叠标签样式
  12.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS); 
  13.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS); 
  14.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND,  SC_MARK_CIRCLEPLUSCONNECTED);
  15.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);
  16.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);
  17.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE); 
  18.     SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);
  19.  
  20.     // 折叠标签颜色
  21.     SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERSUB, 0xa0a0a0);
  22.     SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERMIDTAIL, 0xa0a0a0);
  23.     SendEditor(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERTAIL, 0xa0a0a0);
  24.  
  25.     SendEditor(SCI_SETFOLDFLAGS, 16|4, 0); //如果折叠就在折叠行的上下各画一条横线
  26. }
  27. __fastcall TForm1::TForm1(TComponent* Owner)
  28.     : TForm(Owner)
  29. {
  30.     ...
  31.     setFold();
  32. }
  33. void __fastcall TForm1::WndProc(Messages::TMessage &Message)
  34. {
  35.     TForm::WndProc(Message);
  36.  
  37.     if(Message.Msg == WM_NOTIFY){
  38.         SCNotification* notify = (SCNotification*)Message.LParam;
  39.         if(notify->nmhdr.code == SCN_MARGINCLICK &&
  40.             notify->nmhdr.idFrom == SCINT_ID){
  41.             // 确定是页边点击事件
  42.             const int line_number = SendEditor(SCI_LINEFROMPOSITION,notify->position);
  43.             SendEditor(SCI_TOGGLEFOLD, line_number);
  44.         }
  45.     }
  46. }

现在的效果

\"></p>
<p>这里TForm1::WndProc方法是Scintilla父窗体即我们的TForm1的窗口处理函数。</p>
<p>代码折叠以后我们要通过点击页边上的+和-标记来打开和折叠代码,所以需要页边接收鼠标点击事件:</p>
<pre class= }

现在,我们的成果是这样的(与VS有一拼了吧^_^):

 

分享到:
评论

相关推荐

    Scintilla 【代码编辑器控件,支持语法高亮】

    代码折叠功能则允许用户隐藏或展开代码块,便于管理复杂的代码结构;还有行号显示、搜索与替换、多光标操作、拼写检查等功能,这些都极大地增强了编辑体验。 值得注意的是,知名的文本编辑器软件NotePad++就是基于...

    Scintilla控件编程资料

    - **代码折叠**:Scintilla 支持代码折叠功能,使得用户可以隐藏或展开代码块,提高代码阅读性。 - **自动完成**:通过自动完成功能,Scintilla 可以根据用户输入的内容提供可能的匹配项,提高编写代码的效率。 - **...

    基于对话框和Scintilla控件的C++源代码编辑器

    基于对话框和Scintilla控件的C++源代码编辑器,使用了MFC对话框,使用了Scintilla控件,实现了新建、打开、保存功能,实现了撤消、剪切、复制、粘贴、删除、查找、全选功能,可以实现代码关键字高亮

    基于Scintilla开发的MFC多文档源代码编辑器CodeEditor(源代码)

    支持语法高亮显示、代码折叠、括号匹配、自动换行、行数标记、搜索替换、缩放字体、设置语法高亮规则,它可以同时编辑多种文件类型,多个文档该程序是基于MFC开发的多文档应用程序,使用了开源控件Scintilla。

    Scintilla中文文档+带标签

    Scintilla是一个开源的源代码编辑器控件,支持多种编程语言的语法高亮和代码折叠功能。它最初由Neil Hodgson开发,并作为Lexilla的一部分,提供了一个灵活的词法分析器引擎。Scintilla适用于Windows、GTK+、OSX以及...

    最好开源源代码编辑控件 - scintilla

    而SciTE(Scintilla的文本编辑器)则是一个轻量级的源代码编辑器,专注于快速打开和编辑代码文件,同样基于Scintilla的强大功能。 开发者可以利用Scintilla的API接口,轻松地将源代码编辑功能集成到自己的应用程序...

    Scintilla_and_SciTE

    8. "scintilla 中的代码折叠功能的使用 - libbyliugang的专栏 - CSDNBlog.txt":这份文档可能详细解释了Scintilla的代码折叠功能,有助于提高代码阅读和管理的效率。 这些资源对想要了解或深入使用 Scintilla 和 ...

    scintilla300.zip

    源代码的版本为300,这通常意味着它包含了最新的功能和改进,提供了更高效的操作和更丰富的定制选项。 Scintilla的核心特性包括: 1. **语法高亮**:Scintilla支持多种编程语言的语法高亮,通过自定义词法分析器,...

    [易语言]火花代码编辑器3.4最新版源码,封装scintilla控件

    代码折叠 添加标签 文本搜索功能一如既往强大 新增2000种宏 现在封装为易语言模块 将模块源码及实例奉出 "&gt;最新的scintilla版本全新封装易语言模块源码 大名鼎鼎的Notepad++就是用得这个代码编辑控件 最新版支持...

    c++ scintilla

    它不仅具备基本的文本编辑功能,如文本选择、剪切、复制、粘贴等,还支持语法高亮、自动完成、代码折叠等高级特性,广泛应用于编程环境、文本编辑器、IDE(集成开发环境)等领域。 Scintilla的设计哲学是轻量级和...

    Scintilla开源库使用指南.doc

    Scintilla 的作者还开发了一个名为 SciTE 的演示程序,该程序功能强大,可作为日常代码编辑工具使用,值得下载学习。 #### 三、编译指南 本节重点介绍在 Windows 环境下的编译方法。对于 Linux 平台,虽然未作具体...

    Scintilla控件使用Demo

    - 它不仅提供了基本的文本编辑功能,如复制、粘贴、查找、替换,还支持自定义样式、字体、颜色,以及代码折叠等高级特性。 - 通过Scintilla,开发者可以构建具有高度定制性和高性能的文本编辑器应用。 2. **...

    scintilla 3.72 语法着色器

    Scintilla是一个开源的文本编辑组件,常用于创建支持语法高亮、代码折叠等功能的编程编辑器。3.72是Scintilla的一个版本号,通常每次更新都会修复已知问题,增强性能,并可能引入新的功能。这个压缩包包含的是...

    Scintilla MFC动态

    ### Scintilla MFC动态知识点解析 #### 一、概述 **Scintilla** 是一个开源的、可...通过上述步骤,开发者可以在MFC框架下有效地利用Scintilla的强大功能,为自己的应用程序增加一个功能齐全且易于使用的编辑器组件。

    scintilla的MFC封装

    通过这些文件,开发者可以学习如何在MFC环境中集成Scintilla,创建一个具有语法高亮、代码折叠等功能的文本编辑器。例如,`ScintillaDemo.cpp`中可能会有`InitInstance`函数,它是MFC应用程序的入口点,用于创建主...

    scite源代码 带scintilla

    Scite作为上层应用,提供了一个用户友好的界面和更多的开发者工具,而Scintilla则专注于底层的文本编辑功能,两者共同为开发者提供了一流的源代码编辑体验。 **应用场景** 1. **开发环境**:Scite常被用于快速编写...

    Scintilla MFC静态

    Scintilla是一个开源的文本编辑组件,它提供了丰富的代码编辑功能,如语法高亮、代码折叠、自动完成等,广泛应用于源代码编辑器、IDE和其他需要文本编辑功能的软件中。MFC是微软提供的C++类库,用于构建Windows应用...

    Delphi版函数折叠源代码..rar

    这个"Delphi版函数折叠源代码"显然与编程有关,特别是涉及到Delphi IDE中的代码编辑器功能——函数折叠。函数折叠(Function Folding)是编程环境中一个非常实用的功能,它允许开发者隐藏或展开代码块,如函数或方法...

    scintilla文本编辑器

    Scintilla是一款开源的文本编辑组件,被广泛用于创建自定义的代码编辑器...如果你下载了名为"scintilla"的压缩包,里面应该包含了Scintilla的源代码和其他资源,你可以进一步研究和定制它,打造属于自己的文本编辑器。

Magicbox
Global site tag (gtag.js) - Google Analytics