`

Scintilla使用指南(1) - 简介

阅读更多

Scintilla使用指南(1) - 简介


本文来自CSDN博客:http://blog.csdn.net/jack_china2008/archive/2008/06/08/2525358.aspx

 

 Scintilla是一个开源的编辑组件,它不仅具有通常的编辑功能,而且还提供了语法样式、代码折叠、标签、代码自动完成和提示等功能。

    Windows版本的Scintilla,是一个标准的Windows组件,用户可以通过SendMessage函数发送消息,与其进行交互。SendMessage函数接口如下所示:

LRESULT SendMessage(

     HWND hWnd,

     UINT Msg,

     WPARAM wParam,

     LPARAM lParam

);
 


    GTK+版本的Scintilla,采用和Windows版本相似的方式,进行消息传递。下面的介绍,将以Windows版本为主。

    Scintilla提供了大量的消息API,每个消息可以带有0个、1个或2个参数。SendMessage函数中的消息,通常带有2个参数:wParam和lParam,因此对于没有使用的参数,强烈建议将其设置为0,以保证与将来版本的兼容。对于大多数SCI_SETxxxxx设置类消息,都会有一个对应的SCI_GETxxxxx查询消息。

参数类型
    消息中的参数类型,如下表所示:

参数类型
 参数说明
 
bool
 0表示FALSE,1表示TRUE
 
int
 32位有符号整数
 
const char*
 常量字符串指针,字符串可能以0结尾,或者通过另一个参数指明长度
 
char*
 字符缓冲区指针,Scintilla将会用查询到的字符数据进行填充。在一些情况下,通过另一个参数,指明了缓冲区大小;在另一些情况下,你必须保证缓冲区足够大,可以容纳查询到的字符数据。如果你传入了一个空指针0,消息将返回查询到的字符数据大小。
 
colour
 RGB格式的颜色值。每种颜色取值0 - 255,red、green、blue按如下方式组合,得到colour值:colour = red | (green << 8) | (blue << 16)。0x000000,黑色;0xff0000,蓝色;0x00ff00,绿色;0x0000ff,红色;0xffffff,白色。
 
alpha
 alpha通道值,表示颜色的半透明度,取值范围为:0(完全透明,SC_ALPHA_TRANSPARENT)- 255(不透明,SC_ALPHA_OPAQUE)。值256(C_ALPHA_NOALPHA)表示不使用alpha通道。并不是所有平台都支持alpha通道,并且只有一部分消息实现了alpha效果。消息默认alpha值为256,不使用alpha通道。
 
<unused>
 未使用参数,强烈建议将其设置为0,以保证与将来版本的兼容。
 


数据类型
    在Scintilla中,使用了如下几种数据结构:

CharacterRange
    字符范围数据结构,与WIN32数据结构CHARRANGE相同。

struct CharacterRange {

long cpMin;

long cpMax;

};
 


TextRange
    文本范围数据结构,主要用于从Scintilla组件获取指定范围的文本,与WIN32数据结构TEXTRANGE相同。

struct TextRange {

     struct CharacterRange chrg;

     char *lpstrText;

};
 


TextToFind
    搜索文本数据结构,与WIN32数据结构FINDTEXTEX相同。

struct TextToFind {

     struct CharacterRange chrg;     // 搜索范围

     char *lpstrText;                // 搜索文本

     struct CharacterRange chrgText; // 匹配文本

};
 


SCNotification
         事件通知数据结构。在Windows中,Scintilla将向它的父窗口发送WM_NOTIFY消息;在GTK+中,Scintilla将向它的父窗口发送notify信号。

struct NotifyHeader {  // 与WIN32数据结构NMHDR相同

     void *hwndFrom;    // 发送通知的窗口句柄

     uptr_t idFrom;     // 发送通知的控件ID

     unsigned int code; // SCN_*通知事件代码

};

 

struct SCNotification {

     struct NotifyHeader nmhdr;

     // SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_DWELLSTART,

     // SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK

     int position;

     int ch;                // SCN_CHARADDED, SCN_KEY

     // SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK

     int modifiers;

     int modificationType;  // SCN_MODIFIED

     // SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION

     const char *text;

     int length;            // SCN_MODIFIED

     int linesAdded;        // SCN_MODIFIED

     int message;           // SCN_MACRORECORD

     uptr_t wParam;         // SCN_MACRORECORD

     sptr_t lParam;         // SCN_MACRORECORD

     int line;              // SCN_MODIFIED, SCN_DOUBLECLICK

     int foldLevelNow;      // SCN_MODIFIED

     int foldLevelPrev;     // SCN_MODIFIED

     int margin;            // SCN_MARGINCLICK

     int listType;          // SCN_USERLISTSELECTION, SCN_AUTOCSELECTION

     int x;                 // SCN_DWELLSTART, SCN_DWELLEND

     int y;                 // SCN_DWELLSTART, SCN_DWELLEND

};
 


与MFC的集成
    对于MFC应用程序向导创建的多文档程序,只需添加很少的代码,就可以将Scintilla控件嵌入到View中。假设工程名为EasyEdit,则相关的类分别为CEasyEditApp、CEasyEditDoc、CEasyEditView、CChildFrame。

    首先,在CEasyEditApp中添加私有成员变量HMODULE m_hmodule和虚函数int ExitInstance(),并增加加载DLL代码和释放DLL代码:

BOOL CEasyEditApp::InitInstance()

{

     m_hmodule = LoadLibrary(_T("SciLexer.dll"));

     if (NULL == m_hmodule)

     {

          ::MessageBox(NULL, _T("The Scintilla DLL could not be loaded."),

               _T("Error loading Scintilla"), MB_OK | MB_ICONERROR);

     }

     …

     return TRUE;

};

 

int CEasyEditApp::ExitInstance()

{

     // TODO: 在此添加专用代码和/或调用基类

     if (m_hmodule)

     {

          FreeLibrary(m_hmodule);

     }

 

     return CWinApp::ExitInstance();

}
 


     然后,在CEasyEditView中,增加WM_PAINT消息处理函数void OnPaint(),并在BOOL PreCreateWindow(CREATESTRUCT& cs)和void OnPaint()函数中增加代码:

BOOL CEasyEditView::PreCreateWindow(CREATESTRUCT& cs)

{

     // TODO: 在此处通过修改

     //  CREATESTRUCT cs 来修改窗口类或样式

     cs.lpszClass = _T("Scintilla");

 

     return CView::PreCreateWindow(cs);

}

 

void CEasyEditView::OnPaint()

{

     // CPaintDC dc(this); // device context for painting

     // TODO: 在此处添加消息处理程序代码

     // 不为绘图消息调用CView::OnPaint()

     Default();

}
 


    这样,Scintilla控件就已经集成到View中了。

    为了处理Scintilla控件发送的事件通知,在CChildFrame中,增加WM_NOTIFY消息处理函数BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult):

BOOL CChildFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)

{

     // TODO: 在此添加专用代码和/或调用基类

     SCNotification *pSCNotification = (SCNotification*)lParam;

     CEasyEditView *pView = (CEasyEditView*)GetActiveView();

 

     switch (pSCNotification->nmhdr.code)

     {

          …

     }

 

     return CMDIChildWnd::OnNotify(wParam, lParam, pResult);

}
 

 

 

分享到:
评论

相关推荐

    Scintilla开源库使用指南.doc

    ### Scintilla开源库使用指南知识点详述 #### 一、Scintilla简介与特性 Scintilla 是一款免费的源代码编辑控件,具备高度的可移植性,支持多种操作系统平台,例如 Windows 和 Unix/Linux 等。该编辑器完全开放源...

    Scintilla_and_SciTE

    6. "Scintilla使用指南(一) - sky的技术天空 - CSDNBlog.txt" 和 "Scintilla使用指南(二) - sky的技术天空 - CSDNBlog.txt":这两篇指南深入介绍了Scintilla的使用,包括了如何集成到自定义编辑器中,以及如何利用其...

    Scintilla中文文档+带标签

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

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

    总的来说,Scintilla是一个强大且灵活的源代码编辑控件,它以其开源、跨平台和高度可配置的特性,赢得了开发者的广泛认可和使用。无论是在大型IDE还是小型文本编辑器中,Scintilla都能提供专业级的代码编辑体验。

    在MFC中使用Scintilla进行语法着色

    - "Using-Scintilla-for-syntax-coloring-in-MFC.pdf"可能是详细的步骤指南或示例代码,阅读它可以帮助你更好地理解和实现Scintilla在MFC中的应用。 总之,将Scintilla集成到MFC项目中,可以为你的应用程序提供...

    scintilla-sharp-开源

    1. **README**:这是项目的基本介绍文件,通常包含了项目的概述、安装指南、使用示例以及如何贡献代码等信息。通过阅读 README 文件,开发者可以快速了解如何在自己的项目中集成 Scintilla-Sharp,并了解其主要特性...

    scintilla 3.72 语法着色器

    在提供的链接(http://blog.chinaunix.net/uid-24517893-id-3014393.html)中,可能有更详细的使用指南和示例代码,可以帮助你开始使用Scintilla 3.72。 总之,Scintilla是一个强大且灵活的文本编辑组件,广泛应用...

    ScintWrapper:Pascal 和 Java Scintilla 包装器-开源

    3. `README.md`:这是项目的重要文档,通常包含了项目的简介、安装指南、使用方法、贡献指南等信息。对于ScintWrapper,它可能详细解释了如何在Pascal或Java项目中集成Scintilla,以及封装提供的特性和示例代码。 4...

    Scintilla.NET 2.0

    - **ReadMe.txt**:通常包含安装、配置和使用Scintilla.NET的基本指南和注意事项。 总的来说,Scintilla.NET 2.0 是一个强大的文本编辑组件,对于开发需要集成文本编辑功能的.NET应用来说,是一个理想的选择。通过...

    scintilla201.zip_My Name Is...

    5. **文档**:可能有相关的API文档、用户手册或者开发者指南,帮助理解Scintilla的使用方法和功能。 6. **资源文件**:可能包含字体、颜色方案或者其他与界面相关的资源。 使用Scintilla的优势在于它的可扩展性和...

    eric6----17.03.1这个是支持汉化的版本,需要者自取

    1. "readme.txt":通常这是一个包含软件说明、使用指南或授权信息的文本文件,用户可以通过阅读它来了解如何安装和使用软件。 2. "QScintilla-2.10-5.8.0-cp34.cp35.cp36.cp37-none-win_amd64.whl":这是QScintilla...

    x-studio365软件用户文档Rev2.17

    #### 四、界面介绍与使用指南 - **主菜单栏与工具栏**:提供了场景尺寸选择、设备预览尺寸选择、保存等功能。 - **场景视图**:展示工程的所有场景列表,通过双击场景名切换场景。 - **场景对象探查器**:显示当前...

    XeTex字体设置指南

    传统上,LaTeX使用的Type1字体(也称PostScript字体),用户必须借助fontinst程序来安装,这个过程相对复杂,并且要求用户遵循并不直观的Berry命名规则。随着TrueType和OpenType字体的出现,虽然在LaTeX中使用这些...

    QsciScintilla的使用方法总结QT实例

    **1. 安装与引入QScintilla库** 在使用QScintilla前,首先需要将其库安装到QT开发环境中。这通常通过QT的包管理器或手动下载源码编译完成。安装完成后,在QT项目文件(.pro)中添加以下语句来引入QScintilla模块: `...

    notepad++源码

    1. **readmeFirst.txt** - 这通常是项目的第一阅读文件,包含关于如何构建、运行和理解项目的指南。它可能包含了编译环境设置、依赖库信息、许可协议等内容。 2. **PowerEditor** - 这可能是Notepad++的一个特定...

    notepad++ 源代码

    1. **readmeFirst.txt** - 这通常是一个包含项目相关信息、安装指南或使用注意事项的文件。在Notepad++源代码中,它可能提供了编译源代码的步骤、许可信息、开发者贡献指南等内容。 2. **PowerEditor** - 这可能是...

    notepad++安装

    - `readme.txt`:可能包含一些基本的使用指南或开发者的信息。 3. **高级配置** Notepad++的灵活性在于其高度的自定义性。例如,用户可以通过修改`config.model.xml`来调整界面布局,通过`stylers.model.xml`定制...

    老版DWT使用的代码编辑器控件的例子,Poseidon的控件

    总结来说,这个压缩包提供了一个使用老版DWT和Poseidon的开发实例,其中包含了Scintilla代码编辑器控件的源代码和可能的集成指南。这对于需要在DWT环境中实现高效代码编辑功能的开发者来说是一个宝贵的资源。通过...

    notepad_src

    1. **readmeFirst.txt** - 这是一个常见的文档,通常包含有关项目的重要信息,如安装指南、许可信息、作者详情等。在开始探索源代码之前,读者应首先阅读此文件。 2. **PowerEditor** - 这可能是一个目录,代表一个...

Global site tag (gtag.js) - Google Analytics