• Scintilla概述

Scintilla是一个富文本编辑器控件,支持GTKQTCocoa等多种UI框架。其功能接口的调用主要以消息传递的方式执行,比如载入文本文件,可以使用消息

SCI_SETTEXT(<unused>, const char *text)

该消息的作用是将Scintilla控件所显示的文本替换为消息体里面的text文本。对于消息的具体传递过程,不同的平台(GTKQTCocoa等)对应不同的调用方法,在后续的QT开发会做详细介绍,并给出使用样例。除了执行普通编辑控件操作的消息外,Scancilla还支持控制语法样式、折叠、标记、自动完成和调用提示。

目前Scintilla对从右向左的语言(如阿拉伯语和希伯来语)的支持尚未完善,可以正确显示,但是编辑操作可能会有问题。

SciTE编辑器是Scintilla开发组为了展示Scintilla功能所开源的一款软件,几乎用到了Scintilla的所有接口与功能,可以用作开发参考。

SciTE编辑器 图片引自再推荐一款编辑器:SciTE

  • Scintilla核心接口文件介绍

Scintilla的类型定义以及接口定义头文件分别是ScintillaTypes.h, ScintillaMessages.h以及ScintillaStructures.h

其中ScintillaTypes.h定义了消息中的各种属性枚举类型,以自动折行方式(Line wrapping)为例,在使用编辑器过程中,经常有行文字过长的情况,此时需要通过水平滚动条来看全完整一行内容,给使用者带来很大的不便。因此主流文本编辑器(如notepad++)都会提供自动折行功能。ScintillaTypes.h中的枚举类型Wrap即用于控制自动折行的方式:

enum class Wrap {None = 0,               //非自动折行Word = 1,               //以完整单词为单位做折行Char = 2,               //以单个字符为单位做折行WhiteSpace = 3,         //以空格为单位做折行
};

在开发过程中,开发者可调用消息SCI_SETWRAPMODE(int wrapMode)完成自动折行功能,其中参数wrapMode即使用上述Wrap枚举类型。

ScintillaMessages.h中定义了所有消息枚举值(Message),这些枚举值应用在Scintilla代码文件Editor.cxx中:

sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) 

ScintillaMessages.h中的消息与开发者经常使用的消息命名不同,比如还是以自动折行方式(Line wrapping)为例,开发者使用消息为SCI_SETWRAPMODE,而对应ScintillaMessages.h中的消息则是Message::SetWrapMode。这是由于Scintilla提供给开发者的接口头文件为Scintilla.h,其采用宏定义的方式,定义了所有的消息,SCI_SETWRAPMODE在其中定义为:

#define SCI_SETWRAPMODE 2268

该宏定义的消息与ScintillaMessages.h中枚举消息SetWrapMode = 2268的值相等,因此在开发者发送的消息SCI_SETWRAPMODE同样可以进入Editor::WndProc函数里面case Message::SetWrapMode的处理逻辑中。

ScintillaStructures.h中定义了通知类型,主要用于将Scintilla控件中接收到的如鼠标点击,键盘输入等消息传递出去。以鼠标双击为例,Scintilla控件在接收到鼠标双击操作后,将双击位置以及键盘当前输入(如按住Ctrl双击)传递给外部容器。

void Editor::NotifyDoubleClick(Point pt, KeyMod modifiers) {NotificationData scn = {};scn.nmhdr.code = Notification::DoubleClick;scn.line = LineFromLocation(pt);scn.position = PositionFromLocation(pt, true);scn.modifiers = modifiers;NotifyParent(scn);
}
  • Scintilla消息调用方法

Scintilla功能接口的调用主要以消息传递的方式执行,在其官网的说明文档中,Scintilla给出了全部的消息说明。

比如自动折行,可调用消息:

SCI_SETWRAPMODE(int wrapMode)

再比如获取某一行的字符串,可调用消息:

SCI_GETLINE(line line, char *text)

在实际的开发中,具体的调用接口为ScintillaBase.hScintillaBase类(开发者可以通过继承该类的方式进行二次开发)的成员函数:

sptr_t ScintillaBase::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) ;

其中iMessage为消息类型,即可以设值为上面提到的SCI_SETWRAPMODE以及SCI_GETLINEwParamlParam是相关的附加参数。

SCI_SETWRAPMODE(int wrapMode)的调用方式具体为:

WndProc(SCI_SETWRAPMODE, static_cast<uptr_t>(Wrap::Word));

SCI_GETLINE(line line, char *text)的调用方式具体为:

WndProc(SCI_GETLINE, static_cast<uptr_t>(line), reinterpret_cast<sptr_t>(text));

WndPro函数也具有返回值,一般返回为position,比如获取光标所在当前行,调用消息SCI_GETCURLINE(position length, char *text NUL-terminated) ,其返回值为光标所在的行数,入参text则保存了当前行的字符内容。

注:Scintilla中有些消息带的参数为<unused>,这种情况将其赋值为0即可,具体调用方式为(以SCI_SETTEXT(<unused>, const char *text)为例):

WndProc(SCI_SETTEXT, static_cast<uptr_t>(0), reinterpret_cast<sptr_t>(text)))
  • scintilla事件处理方法

Scintilla在ScintillaStructures.h中定义了通知事件数据类型,如下所示:

struct NotificationData {NotifyHeader nmhdr;Position position;/* SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, *//* SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK, *//* SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK, *//* SCN_INDICATORCLICK, SCN_INDICATORRELEASE, *//* SCN_USERLISTSELECTION, SCN_AUTOCSELECTION */
​int ch;/* SCN_CHARADDED, SCN_KEY, SCN_AUTOCCOMPLETED, SCN_AUTOCSELECTION, *//* SCN_USERLISTSELECTION */KeyMod modifiers;/* SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, *//* SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, */
​ModificationFlags modificationType; /* SCN_MODIFIED */const char *text;/* SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED */
​Position length;        /* SCN_MODIFIED */Position linesAdded;    /* SCN_MODIFIED */Message message;    /* SCN_MACRORECORD */uptr_t wParam;  /* SCN_MACRORECORD */sptr_t lParam;  /* SCN_MACRORECORD */Position line;      /* SCN_MODIFIED */FoldLevel foldLevelNow; /* SCN_MODIFIED */FoldLevel foldLevelPrev;    /* SCN_MODIFIED */int margin;     /* SCN_MARGINCLICK */int listType;   /* SCN_USERLISTSELECTION */int x;          /* SCN_DWELLSTART, SCN_DWELLEND */int y;      /* SCN_DWELLSTART, SCN_DWELLEND */int token;      /* SCN_MODIFIED with SC_MOD_CONTAINER */Position annotationLinesAdded;  /* SCN_MODIFIED with SC_MOD_CHANGEANNOTATION */Update updated; /* SCN_UPDATEUI */CompletionMethods listCompletionMethod;/* SCN_AUTOCSELECTION, SCN_AUTOCCOMPLETED, SCN_USERLISTSELECTION, */CharacterSource characterSource;    /* SCN_CHARADDED */
};

该数据结构主要用于将Scintilla控件中接收到的如鼠标点击,键盘输入等消息传递出去。

以文本内容的修改为例,当有增删改的动作后,Scintilla控件即向外部容器发送待保存事件:Notification::SavePointLeft。此时外部容器可以做对应处理,比如可以将文件标题最后增加*号,表示需要保存。发送相关事件的代码在Editor.cxx中:

void Editor::NotifySavePoint(bool isSavePoint) {NotificationData scn = {};if (isSavePoint) {scn.nmhdr.code = Notification::SavePointReached;} else {scn.nmhdr.code = Notification::SavePointLeft;       //文本内容有修改后进入该语句}NotifyParent(scn);      //此处向外部容器发送事件
}

上面代码中的NotifyParent(scn)既是向外部容器发送事件的接口函数。在Editor类中,定义了如下纯虚函数:

virtual void NotifyParent(Scintilla::NotificationData scn) = 0;

因此在实际的开发中,开发者可以通过继承ScintillaBase类的方式进行二次开发。(ScintillaBase类继承Editor类)

Scintilla教程(1): 入门介绍相关推荐

  1. 【Java基础教程】(一)入门介绍篇 · 上:快速掌握核心概念,开启Java世界的探索之旅!这篇Java入门宝典助你翱翔~

    Java基础教程之入门介绍 · 上 本节学习目标 1️⃣ Java发展简史 1.1 诞生 1.2 发展 1.3 分支 2️⃣ 特征 3️⃣ 代码执行过程

  2. Asp.Net MVC4.0 官方教程 入门指南之一-- 入门介绍

    本教程将为您讲解使用微软的Visual Studio  2012 来建立一个ASP.NET MVC4 Web应用程序所需要的基础知识. 本示例将构建什么样的应用程序? 您将实现一个简单的电影管理应用程 ...

  3. c语言驱动程序开发基础教程,C 语言入门介绍

    C 语言入门介绍 适用于初学者和专业人士的C语言教程采用编程方法,可帮助您轻松理解C语言教程.我们的C教程通过程序解释了每个主题. C语言是由Dennis Ritchie开发的,用于创建与硬件设备(例 ...

  4. ps基础教程新手入门第一篇:ps界面的介绍

    欢迎来到慕恬瑶平面设计,今天给大家介绍PS基础教程新手入门第一篇: ps界面的介绍.目的让第一次接触ps的小伙伴通过ps基础教程新手入门来了解ps界面的菜单栏,工具栏已方便日后使用. 首先,打开PS ...

  5. 手机开发平台指南、教程和资料介绍

    近来无事,把手机开发平台的学习指南.教程和资料总结一下,方便大家参考.     手机客户端软件开发最大的困难就是平台不统一,手机开发平台太多.     手机可分为智能手机开发和feather phon ...

  6. 独家 | 集成学习入门介绍

    作者:Jason Brownlee 翻译:wwl 校对:王琦 本文约3300字,建议阅读8分钟. 本文介绍了我们在生活中的许多决定包括了其他人的意见,由于群体的智慧,有的时候群体的决策优于个体.在机器 ...

  7. grub4dos初级教程-入门篇

    grub4dos初级教程-入门篇 2008年04月21日 星期一 15:37 0 为何写此初级教程? 假如你是第一次听说grub,你可能说我不需要grub.那么,你是否用过"一键ghost& ...

  8. [Python爬虫] scrapy爬虫系列 一.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  9. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的"原图"等,此时尝试学习Phantomjs和Caspe ...

  10. Oracle数据库基础教程:入门其实很简单

    为什么80%的码农都做不了架构师?>>>    Oracle数据库基础教程:入门其实很简单 Oracle数据库系统是目前最流行的客户/服务器数据库之一.本文集从初学者的角度出发,由浅 ...

最新文章

  1. 一致性hash算法 - consistent hashing
  2. 将存储过程的返回值赋给变量
  3. OpenCASCADE绘制测试线束:拓扑命令之3D模型周期性
  4. android media_rw sdcard_rw,大约Android 了解权限管理
  5. Redis- 内存数据库Redis之安装部署
  6. vivo应用商店电脑版_VIVO应用商店代理商江湖的那些关系
  7. python查找指定字符所在行号_在python中获取当前位置所在的行号和函数名
  8. Geoserver的ImageMosaic数据源添加以及服务发布
  9. OllyDBG 入门
  10. python水仙花数的编程代码-Python 求“水仙花数”的方法和具体代码
  11. python语言是编程还是脚本_编程语言和脚本语言有什么区别?
  12. 教你4种压缩PDF让文档快速变小的方法
  13. 服务器lsass系统错误,Win7电脑无法正常登陆提示lsass.exe系统错误如何解决
  14. 儒略日 Julian Date
  15. 关于在手机上注册Google账号
  16. .net MVC 局部视图
  17. 用Sample Grabber捕获视频
  18. Unity学习 — 官方中文版本教程详解
  19. Java语言每日一练—第11天:最优选择2
  20. 经济学文章---巨量人口对政经的加速减速效应、

热门文章

  1. python求绝对值_python求绝对值
  2. 从网易云音乐看新媒体内容运营法则
  3. 从矩阵谱分解到矩形的最少正方形剖分
  4. python ipo模型是什么意思_IPO里的估值模型是什么情况?
  5. Python小工具之GUI倒计时提醒
  6. 青龙面板 精易论坛签到脚本
  7. linux c语言 取随机数,C语言 获取随机数
  8. windows64位 注册ocx
  9. PS零基础自学笔记:常见操作方法记录(去水印、抠图、调色调)
  10. Matlab线型,颜色及标记的自定义