Scintilla笔记(4)
Scintilla增加Marker
本节讲解一下怎样在Scintilla中添加Marker、以及Marker定义.。
在开始之前首先了解一下编辑器中两个控件页边(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个标记作为代码折叠专用标记(后面还会讲到)。
开始添加Marker:
首先我们要告诉编辑器,要在哪一个页边(Margin)中添加标记,此时可自定义
m_ScintillaEdit.SetMarginTypeN(1, SC_MARGIN_SYMBOL); // 假设我们在第二个页边中添加标记(Marker)
m_ScintillaEdit.SetMarginSensitiveN(2, TRUE); //第二个页边中可以接收鼠标事件消息
根据源码可知,默认第一个Margin显示行号默认不显示行号、第二个Margin显示标记切宽度为16、第三个Margin显示标记且默认不显示,如图所示:
其中折叠、展开也为Marker,所以在笔记(3)中所讲,设置折叠标记属性,如下:
m_ScintillaEdit.SetMarginTypeN(2, SC_MARGIN_SYMBOL); //设置2号Margin用于显示折叠标记(Marker)
m_ScintillaEdit.SetMarginMaskN(2, SC_MASK_FOLDERS); //设置2号Margin页边掩码为折叠
m_ScintillaEdit.SetFoldLevel(2, SC_MASK_FOLDERS);
|
接下来我们就可以通过
m_ScintillaEdit.MarkerAdd(line, marker_num); 添加Marker
第一个参数为行号,比较好理解,此时重点说一下第二个参数markerNum。
由于标记(Markers)可以有32中标记、其中25-31是留个折叠使用的,所以也只有25中可以留给我们自己定义
比如,我们定义0号的Marker为断点、1号的Marker为属性、2号断点为错误行,所以此时的0、1、2号则就是为markeNum。那么怎么定义0号的Marker为断点、1号的Marker为属性、2号断点为错误行呢?
可以通过接口m_ScintillaEdit.MarkerDefine(0 , SC_MARK_ROUNDRECT); // 设置0号Marker为圆矩形
m_ScintillaEdit.MarkerDefine(1 , SC_MARK_ARROW); // 设置1号Marker位箭头
m_ScintillaEdit .MarkerDefinePixmap(2, reinterpret_cast<char *>(error_xpm)); //设置为自定义的图片
这样我们就可以直接调用MarkerAdd添加Marker了。
接下来讲一下MarkerGet接口,MarkerGet函数是获取当前行是否设置了Marker,并且获取Marker的类型。
如在第一行中设置了0号Marker,此时调用MarkerGet后得到结果为0x01,即0x00000001,表示第一位为1,说明设置了0号Marker
如在第一行中设置了2号Marker,此时条用MarkerGet后得到结果为0x04,即0x00000002,表示第三位为1,说明设置了2号Marker
。。。
此时即可使用代码判断是否设置了某个Marker,如下:
if(m_ScintillaEdit.MarkerGet(0) & 0x00000001 != 0)
设置了0号Marker
else if (m_ScintillaEdit.MarkerGet(0) & 0x00000002 != 0 )
设置了1号Marker
else if(m_ScintillaEdit.MarkerGet(0) & 0x00000004 != 0 )
设置了2号Marker