和记娱乐


网站导航

联系我们

和记娱乐

联系人: 

电 话:021-64057486

公司网址:http://www.happy123456789.com

   址:成都市松江区漕河泾松江新兴产业园区研展路丰产支路55号B座803室

邮编:201165


通信科技

您的当前位置: 和记娱乐主页 > 通信科技 >

Scintilla更多的控制命令和实现细节的学习

发布日期:2020-01-26 08:36 来源:和记h88 发布人:和记娱乐 点击:

  咱们继续学习Scintilla更多的控制命令和实现细节,完善我们的编辑器; 页边(Margins)和标记(Markers)

  代码折叠是现代IDE和代码编辑器的必备功能,如果现在推出一个不支持折叠的编辑器,那是要被BS地~~。为了不被BS,很有必要先“研究”一下Scintilla的页边(Margins)和标记(Markers)功能。

  页 边(Margins):页边是位于文本显示区左边的一竖条区域,它可以用于显示行号、、断点标记等东东。Scintilla最多可以有5个页边(从左 到右的编号为0~4),每个页边可以使用SCI_SETMARGINTYPEN命令确定是用于显示行号还是符号。我们可以用 SCI_SETMARGINWIDTHN命令控制一个页边的宽度,如果设置为0,则表示不显示该页边。默认是只显示宽度为16的1号页边。 标 记(Markers):标记,不用说也知道是用来标记文本(确切地说,是文本行)的。我们可以使用32种标记(编号0~31),我们可以决定这 32种标记的意义,如标记0用来表示断点、标记1~10表示、标记20表示语法错误行等等。不过,如果编辑器要支持代码折叠功能,我们得把标记 25~31留出来,把这7个标记作为代码折叠专用标记(后面还会讲到)。 告诉页边显示哪些标记

  当页边不是设定为显示行号时(由SCI_SETMARGINTYPEN命令设置),那么它就会显示标记。刚才说过Scintilla有32种标记,一般来说不会让一个页边来显示所有的标记,而是只显示部分标记。

  在一个页边里可以显示哪几种标记由SCI_SETMARGINMASKN命令设置,它的参数是一个32位掩码(mask)值,掩码值的第n位为1时表示该页边可显示n号标记。

  SCI_MARKERADD(int line, int markerNumber)  在指定行加入一个markerNumber号标记 SCI_MARKERDEFINE(int markerNumber, int markerSymbols)  定义markerNumber号标记的样式 SCI_MARKERDELETE(int line, int markerNumber) 在指定行上的删除markerNumber号标记 SCI_MARKERDELETEALL(int markerNumber) 删除文本中所有markerNumber号标记 SCI_MARKERSETFORE(int markerNumber, int colour) 为markerNumber号标记指定前景色 SCI_MARKERSETBACK(int markerNumber, int colour) 为markerNumber号标记指定背景色SendEditor(SCI_SETMARGINTYPEN,0,SC_MARGIN_SYMBOL);SendEditor(SCI_SETMARGINTYPEN,1, SC_MARGIN_SYMBOL);SendEditor(SCI_SETMARGINTYPEN,2, SC_MARGIN_NUMBER);

  默认是SC_MARK_CIRCLE,小圆圈。你可以试试其它的。(注意SC_MARK_CHARACTER比较特殊,它和一个ASCII码加起来决定标记显示为一个对应的ASCII字符)

  前面曾说过当编辑器有代码折叠功能时,25号到31号这7个标记是作为代码折叠专用标记的。在scintilla.h中,我们可以找到它们的定义:

  要加入代码折叠功能,还有一个最最关键的事情,就是要得到语析器(Lexer)的支持,的这些标记都是由语析器自动添加删除的。一般来说,只要用下面这条命令就可以了让语析器支持代码折叠了:

  代码折叠以后我们要通过点击页边上的+和-标记来打开和折叠代码,所以需要页边接收鼠标点击事件:

  代码折叠以后我们要通过点击页边上的+和-标记来打开和折叠代码,所以需要页边接收鼠标点击事件:

  Scintilla自带的标记样式和VS比起来还有差距,反正偶是怎么调都觉得有点土。Scintilla允许我们自己定义标记的样式,方法是:

  xpm在linux系统下用得比较多,它和BMP、jpg一样也是一种图片格式,有不少工具可以把图片转换成xpm格式的,比如我喜欢的免费看图软件XnView就可以,想必ACDSee也行吧。

  xpm比较特殊的地方是它可以作为头文件直接被C语言调用,吃惊吧?用文本编辑器打开它看看,呵呵,其实它就是一个数组定义。

  如下面这个数据(代码)就是后面马上就要用到的minus.xpm和plus.xpm图片文件的内容(从eclipse里挖出来的):

  在VS里编写C++代码时,输入回车换行后会保持和上一行的缩进一致,输入{字符后回车还会帮我们多缩进一次,输入}后又能自动退回。我们的编辑器也要实现这个功能。

  现在再仔细了解一下Scintilla的通知消息(),除了前面用到的页边点击事件外,还有很多事件非常有用。

  当用户输入一个字符时,SCN_CHARADDED事件触发,SCNotification的ch保存了输入的字符。 当更新文档界面时,SCN_UPDATEUI事件触发。输入字符,改变字体风格,改变都会引起界面更新 演示代码

  VS的代码完成和函数提示功能是很值得称道的,它们可以极大地提高我们的编程效率(造成我现在写代码时往往只记住前四个字母,如果在对象后面点了小数点后不出现提示就会心慌意乱的说-_-),尽管有时也会失效。

  做为IDE这个功能是绝对不能少D。即使你只打算做个编辑器,如果有这个功能那也是一大亮点啊~~(目前很多代码编辑器都没这个功能的说)。

  关于函数提示的几个命令以SCI_CALLTIP作为前缀,这里只介绍我们即将使用的几个命令(更多命令见:)

  在我们程序中加入提示的最佳时机是SCN_CHARADDED(见上一节)事件。当用户输入左圆括号(时,取得括号左边的函数名,然后显示出该函数的完整定义。

      和记娱乐,和记h88,h88平台官网