主要类
CellBuffer
|
保存文本,样式信息,恢复堆栈,标签,代码叠起结构等信息
|
ContractionState
|
|
Document
|
包含CellBuffer和一些高度抽象操作,管理样式处理。
|
Editor
|
使用ContractionState, Indicator, LineMarker, Style, ViewStyle来显示文档KeyMap和ContractionState同样在这里使用。
|
Indicator
|
|
LineMarker
|
|
Style
|
|
ViewStyle
|
|
KeyMap
|
|
ScintillaBase
|
Editor的子类,增加了调用提示和自动完成等功能,使用类CallTip和AutoComplete
|
CallTip
|
|
AutoComplete
|
|
Scintilla文档的每个字符都紧跟关联的样式信息。一个字节的字符信息和一个字节的样式信息作为一个单位。样式信息高3位是指示器,低5位是索引号。索引号索引一个存放样式的数组。这样就可以表示32种基础样式,几乎包含所有语言的样式。三个无关指示器可以一次显示语法错误,非法命名,和缩进错误。关于样式的位可以通过SCI_SETSTYLEBITS来改变最多其中7位,剩下的位用于指示器。
字符位置信息以0开始计数,至nLen-1,中文的字符是两个字符为一个文字,这样计数就有误了(DBCS)
Scintilla的消息都是以SCI_GETxxx或者SCI_SETxxx来命名的
一.文本取回与修改
主要消息有:
SCI_GETTEXT(int length, char *text)
SCI_SETTEXT(<unused>, const char *text)
SCI_SETSAVEPOINT
SCI_GETLINE(int line, char *text)
SCI_REPLACESEL(<unused>, const char*text)
SCI_SETREADONLY(bool readOnly)
SCI_GETREADONLY
SCI_GETTEXTRANGE(<unused>, TextRange*tr)
SCI_ALLOCATE(int bytes, <unused>)
SCI_ADDTEXT(int length, const char *s)
SCI_ADDSTYLEDTEXT(int length, cell *s)
SCI_APPENDTEXT(int length, const char*s)
SCI_INSERTTEXT(int pos, const char*text)
SCI_CLEARALL
SCI_CLEARDOCUMENTSTYLE
SCI_GETCHARAT(int position)
SCI_GETSTYLEAT(int position)
SCI_GETSTYLEDTEXT(<unused>, TextRange*tr)
SCI_SETSTYLEBITS(int bits)
SCI_GETSTYLEBITS
SCI_TARGETASUTF8(<unused>, char *s)
SCI_ENCODEDFROMUTF8(const char *utf8,char *encoded)
SCI_SETLENGTHFORENCODE(int bytes)
1)SCI_GETTEXT(int length, char *text)
此函数可以取得控件中的字符串存到一个缓冲区,这样就可以保存文档了。流程是使用SCI_GETLENGTH
获得字符串的长度然后根据取得的长度申请一个缓冲区,再利用该消息取得文本,然后就可以保存文本了,同时需要利用
SCI_SETSAVEPOINT
标记文本已保存了。
做了例子果然是可以运行的,不知道作者是如何制作这样一个控件的。我对他的内部运行机制很感兴趣,想仔细看一些具体的代码,而不是仅仅使用它。另外发现
API
使用的字符是宽字符,这一点很令人讨厌。
另外获取处理函数的过程用了上次写的typedef的用法,改一下看上去就清晰多了
typedef int (*EditorSendFun)(void*,int,int,int);
void* ptr;
EditorSendFun editsendmessage;