页边(Margins)和标记(Markers)
来自http://www.cppprog.com/2009/1111/176.html
代码折叠是现代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_SETMARGIN或SCI_GETMARGIN作为前缀,如:
- SCI_SETMARGINTYPEN(int margin, int type) 设置页边显示行号还是符号,type可以是SC_MARGIN_SYMBOL或SC_MARGIN_NUMBER
- SCI_SETMARGINWIDTHN(int margin, int pixelWidth) 设置页边宽度
- SCI_SETMARGINMASKN(int margin, int mask) 设置页边掩码
- SCI_SETMARGINSENSITIVEN(int margin, bool sensitive) 设置页边是否接受鼠标点击事件
所有标记相关的命令以SCI_MARKER作为前缀,如:
- 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号标记指定背景色
演示代码
-
-
void TForm1::example()
-
{
-
-
for(int i=0; i<10; i++)
-
SendEditor(SCI_APPENDTEXT, 12, (sptr_t)"hello world ");
-
-
SendEditor(SCI_SETMARGINTYPEN,0,SC_MARGIN_SYMBOL);
-
SendEditor(SCI_SETMARGINWIDTHN,0, 9);
-
SendEditor(SCI_SETMARGINMASKN,0, 0x01);
-
-
SendEditor(SCI_SETMARGINTYPEN,1, SC_MARGIN_SYMBOL);
-
SendEditor(SCI_SETMARGINWIDTHN,1, 9);
-
SendEditor(SCI_SETMARGINMASKN,1, 0x06);
-
-
SendEditor(SCI_SETMARGINTYPEN,2, SC_MARGIN_NUMBER);
-
SendEditor(SCI_SETMARGINWIDTHN,2, 20);
-
-
for(int i=0; i<10; i++)
-
{
-
-
SendEditor(SCI_MARKERADD, i, i%3);
-
}
-
-
-
SendEditor(SCI_MARKERSETFORE,0,0x0000ff);
-
SendEditor(SCI_MARKERSETFORE,1,0x00ff00);
-
SendEditor(SCI_MARKERSETFORE,2,0xff0000);
-
}
显示效果是:
如果你不喜欢这些圆圈,可以用SCI_MARKERDEFINE命令改变标记的样式,可选的有:
SC_MARK_CIRCLE, SC_MARK_ROUNDRECT, SC_MARK_ARROW, SC_MARK_SMALLRECT,
SC_MARK_SHORTARROW, SC_MARK_EMPTY, SC_MARK_ARROWDOWN, SC_MARK_MINUS,
SC_MARK_PLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_TCORNER, SC_MARK_BOXPLUS,
SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUS, SC_MARK_BOXMINUSCONNECTED,
SC_MARK_LCORNERCURVE, SC_MARK_TCORNERCURVE, SC_MARK_CIRCLEPLUS,
SC_MARK_CIRCLEPLUSCONNECTED, SC_MARK_CIRCLEMINUS, SC_MARK_CIRCLEMINUSCONNECTED,
SC_MARK_BACKGROUND, SC_MARK_DOTDOTDOT, SC_MARK_ARROWS, SC_MARK_PIXMAP,
SC_MARK_FULLRECT, SC_MARK_LEFTRECT, SC_MARK_CHARACTER
默认是SC_MARK_CIRCLE,小圆圈。你可以试试其它的。(注意SC_MARK_CHARACTER比较特殊,它和一个ASCII码加起来决定标记显示为一个对应的ASCII字符)
有了这些基础,我们可以动手为Scintilla加入代码折叠功能了...
分享到:
相关推荐
在FastReport中,页边距是通过Report对象的Margins属性来设置的,该属性包括上、下、左、右四个方向的边距值。通过修改这个属性值,我们可以实现动态调整页边距的效果。在运行时,我们可以根据用户输入或者程序逻辑...
然而,需要注意的是,`Margins`属性提供的值并不总是反映实际的物理页边距,因为这可能受到打印机驱动程序和操作系统的影响。 下面是一段基本的Delphi代码示例,展示了如何获取打印页边距: ```delphi uses ...
The ability to apply margins, borders, and padding to any web page element is one of the things that sets CSS so far above traditional markup. With this practical guide, you will not only learn how to...
1. 页面方向的影响:当您将页面方向由横向更改为纵向时,可能会出现错误消息,提示“Settings you chose for the left and right margins, column spacing, or paragraph indents are too large for the page width ...
在统计分析领域,Stata的`margins`命令是一个非常强大的工具,用于计算和解释模型的边际效应。这个命令使得用户能够深入理解回归结果,尤其是线性模型、广义线性模型(GLM)以及非线性模型。现在,这个功能已经被...
例如,你可以设置`Margins.Left`、`Margins.Top`、`Margins.Right`和`Margins.Bottom`来分别控制上、下、左、右的边距。 - 调整TLayout的`Align`属性,确保Memo组件在其内部正确显示。通常设置为`alClient`,让Memo...
在Windows操作系统中,通常使用GDI(Graphics Device Interface)或者更高级的GDI+来处理打印任务,包括设置和获取打印页边距。GDI允许开发者与打印机设备进行交互,提供了一套丰富的图形绘制和文本渲染函数。通过...
前言 iOS 11 已经发布了一段时间了,随手记团队也早早的完成了适配。在这里,我们做了点总结,与大家一起分享一下关于 iOS 11 ...总的来说,layout margins 可以视作视图的内容和内容之间的空隙。它由每个边的 insetV
这涉及到计算当前页的开始和结束行号,以及判断何时需要开始新的页面。我们可以维护一个变量来追踪当前页的行数,并在达到30行时进行换页。 4. **打印操作**:使用PrintDocument类进行实际的打印操作。我们需要重写...
4. 根据需要调整 **Legend 页** 和 **Titles 页** 的设置,确保图表标题和图例清晰易读。 5. 最后,在 **Format 页** 中设置数据柱的颜色和样式。 通过以上步骤,我们可以构建一个具有丰富视觉效果的数据图表,...
摘要:本文总结了美国多产业投资策略的要点,涵盖了 Process Automation、LNG Update 和 HVAC supplier margins 等多个方面的信息,从财报中获取的信息对投资决策具有重要的参考价值。 一、投资策略概述 投资策略...
3025中英文菜单对照表 ...本文档提供了3025打印机的中英文菜单对照表,涵盖了机器状态、配置页、演示页、网络信息、耗材信息、计数器、默认功能、系统设置、维修和网络等方面的内容,为用户提供了详细的机器操作指南。
此外,我们还需要注意到PDF文件的安全性和加密性,以确保生成的PDF文件能够在不同设备和平台上正确显示和保护。 通过Java实现对PDF页面的详细设置是指使用Java语言对PDF文件进行个性化设置的过程,通过使用Free ...
此外,`Section.PageSetup`对象的属性可以设置每页的行数和每行的字符数,从而影响自动分页行为。 示例代码片段: ```csharp using Aspose.Words; // 创建或加载文档 Document doc = new Document(); ...
可以使用 `margins` 函数设置坐标轴的尺寸限制,使用 `axis` 函数设置坐标轴的范围。 图例 可以使用 `legend` 函数添加图例,使用 `set` 函数设置图例的参数。 标记 可以使用 `tick_params` 函数设置标记的参数...
FastReport2.53.FS.for.Delphi567 Changes in v2.53: ...- fixed Excel XML export margins error - updated language resources (czech, romanian) - minor exports bug fixes - minor engine bug fixes.
在实际应用中,可能还需要处理更多的细节,例如添加页眉和页脚、设置页码、处理数据不足一页时的情况等。这个“C#报表操作--设置每页打印20行实例源码-D7.rar”压缩包应该包含了完整的示例代码,你可以下载并运行它...